gpt4 book ai didi

android - 如何使用 fragment 创建后才可用的数据填充 fragment ?

转载 作者:行者123 更新时间:2023-11-30 01:13:21 26 4
gpt4 key购买 nike

我有一个通过 WebService 获取数据的 Activity ,它从那里创建元素来显示数据。一些数据被分组,所以我的解决方案是在主布局下方的它们自己的 fragments 中显示分组数据,允许用户在组之间滑动,可能在顶部有一个选项卡来显示组名称.

我遇到的问题是 Activity 中的 fragment 是在网络调用发生之前创建的,使它们为空或使用旧数据。然后我创建了一个 sharedpreferences 监听器并将 fragments 布局创建方法放入其中。主要方法获取数据,写入 sharedpreferences fragment 检测到变化并创建它的布局,或者我是这么想的。

有些组在项目之间是相同的,因此从一个移动到另一个不会触发 onchange 事件,因此不会触发布局创建方法。然后我决定执行以下操作以在写入共享首选项后始终触发 onchange 事件

final Boolean updated = settings.getBoolean("UPDATED_1", false);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("UPDATED_" + pageNum, !updated);

我只是不认为这是最好的解决方案,它也有它的问题并且不是每次都触发(我还没有解决)

什么是更好的解决方案?我还没有诊断出内存泄漏,这让事情变得更加头疼。

我只是想将我的数据抓取方法移动到 ViewPager 初始化之前,但我不确定这是否能解决我的问题。

最佳答案

我不建议等到获得数据后再显示 View ,因为这会影响用户体验并且看起来很慢。

相反,您可以在您的 fragment 中实现一个 AsyncTaskLoader,这样您就可以在从你的服务器。在此期间,只需显示一个微调器,直到检索到数据,然后将其隐藏并使用 adapter.notifyDataSetChanged(); 更新您的列表。

这是一个 AsyncTaskLoader 的例子(在我的例子中它是一个数据库查询而不是像你这样的服务器调用):

public class GenericLoader<T extends Comparable<T>> extends AsyncTaskLoader<ArrayList<T>> {
private Class clazz;

public GenericLoader(Context context, Class<T> clazz) {
super(context);
this.clazz = clazz;
}

@Override
public ArrayList<T> loadInBackground() {
ArrayList<T> data = new ArrayList<>();
data.addAll(GenericDAO.getInstance(clazz).queryForAll());
Collections.sort(data);
return data;
}
}

然后在你的 fragment 中:

public class FragmentMobileData extends Fragment implements ListAdapter.OnItemClickListener, LoaderManager.LoaderCallbacks<ArrayList<EntityCategories.EntityCategory>> {

public static String TAG = "FragmentMobileData";

private ImageListAdapter adapter;
private ArrayList<EntityList> mCategories = new ArrayList<>();

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
String result = bundle.getString(DatabaseService.RESULT);

if (DatabaseService.NO_CONNECTION.equals(result)) {
Utils.showToastMessage(getActivity(), "No internet connexion", true);
} else if (DatabaseService.RESULT_TIMEOUT.equals(result)) {
Utils.showToastMessage(getActivity(), "Bad connection. Retry", true);
}
getActivity().getSupportLoaderManager().initLoader(1, null, FragmentMobileData.this).forceLoad();
}
};

@Bind(R.id.progressBarEcard)
ProgressBar spinner;
@Bind(R.id.list)
RecyclerView list;
public FragmentMobileData() {
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_mobile_plan, container, false);
ButterKnife.bind(this, view);
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Mobile");

list.setLayoutManager(new LinearLayoutManager(context));
list.addItemDecoration(new DividerItemDecoration(context, R.drawable.divider));
adapter = new ImageListAdapter(mCategories, this);
list.setAdapter(adapter);

Intent intent = new Intent(context, DatabaseService.class);
intent.setAction(DatabaseService.UPDATE_DATA);
getActivity().startService(intent);
return view;
}

@Override
public void onPause() {
super.onPause();
getActivity().unregisterReceiver(mReceiver);
}


@Override
public void onResume() {
super.onResume();
getActivity().registerReceiver(mReceiver, new IntentFilter(DatabaseService.UPDATE_DATA));
}

@Override
public Loader<ArrayList<EntityCategories.EntityCategory>> onCreateLoader(int id, Bundle args) {
return new GenericLoader(context, EntityCategories.EntityCategory.class);
}

@Override
public void onLoadFinished(Loader<ArrayList<EntityCategories.EntityCategory>> loader, ArrayList<EntityCategories.EntityCategory> data) {
if (mCategories.size() != data.size()) {
mCategories.clear();
mCategories.addAll(data);
adapter.notifyDataSetChanged();

Intent intent = new Intent(context, DownloadFilesService.class);
context.startService(intent);
}
spinner.setVisibility(View.GONE);
}

@Override
public void onLoaderReset(Loader<ArrayList<EntityCategories.EntityCategory>> loader) {
mCategories.clear();
adapter.notifyDataSetChanged();
}
//...
}

关于android - 如何使用 fragment 创建后才可用的数据填充 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38205894/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com