异步更新ListFragment

时间:2014-05-02 10:41:20

标签: android asynchronous fragment android-listfragment

我已经检查了有关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();
    }
}
}

刷新方法会触发,但不会产生任何结果。我还缺少什么?我应该选择一种完全不同的方法吗?

2 个答案:

答案 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();