我已经检查了有关ListFragments
的异步更新的其他答案,并且已经发现notifyDataSetChanged()
方法最常见的问题是,开发人员倾向于覆盖初始适配器source,导致适配器丢失引用,因此不更新视图。我有一个ListFragment
,我想异步更新。我决定做的是在AsyncTask
中解析列表数据,最后更新onPostExecute()
中的片段。我希望UI尽可能流畅,所以我想避免在主线程上进行繁重的处理。在创建视图后我调用AsyncTask
以避免null
指针。
public class CategoryFragment extends ListFragment {
ArrayList<Category> categoriesArray = new ArrayList<Category>();
CategoryAdapter adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_category, container, false);
adapter = new CategoryAdapter(getActivity(), R.layout.category_list_item, categoriesArray);
setListAdapter(adapter);
return rootView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
new UpdateUITask().execute(categories);
}
...
// The async task to update the UI.
class UpdateUITask extends AsyncTask<String, String, ArrayList<Category>>{
@Override
protected ArrayList<Category> doInBackground(String... input) {
// Do some data processing, to fill the categoriesArray.
// categoriesArray.add(...); -- loop
return categoriesArray;
}
@Override
protected void onPostExecute(ArrayList<Category> result) {
super.onPostExecute(result);
adapter.notifyDataSetChanged();
}
}
}
刷新方法会触发,但不会产生任何结果。我还缺少什么?我应该选择一种完全不同的方法吗?
答案 0 :(得分:1)
看起来像您的categoriesArray实例正在迷失。 adapter.notifyDataSetChanged();
仅在您刚刚传递给适配器的listArray的引用丢失或更改时才起作用。所以,我建议你请确认一下。
此外,如果您要填充自定义数组,请使用onProgressUpdate() method
的{{1}}。它也会减少加载时间。
你可以这样做:
AsyncTask
答案 1 :(得分:0)
使用以下代码为您的AsyncTask,但请确保您再次更改原始categoryList。
private class UpdateUITask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
// Do some data processing, to fill the categoriesArray.
return null;
}
@Override
protected void onPostExecute(Void result) {
adapter.notifyDataSetChanged();
}
}
只需传递任何参数即可运行此任务。
new UpdateUITask().execute();