使用常规(支持)片段中的AsyncTaskLoader更新适配器而不更新ListView

时间:2014-12-22 09:20:49

标签: android android-fragments android-listview android-listfragment android-loader

我无法使用AsyncTaskLoader回调来更新常规Fragment中的适配器。我正在使用片段支持库,版本19.1.0。

在我的onLoadFinished()回调中,我只是做mAdapter.addAll(data)。我使用调试器来验证是否调用了回调,并且所有数据都已添加到适配器中。问题是列表视图根本不会更新。

我已经尝试notifyDataSetChanged()invalidateViews() - 没效果。

到目前为止,我看过的所有示例或教程都使用ListFragmentListActivity而没有自定义布局;我试过这个,它运行正常。特别是,我尝试过Android Design Patterns loader tutorial的示例程序。不幸的是,我无法使用ListFragment,因为我正在使用StickyListHeaders库(但即使尝试使用常规ListView也无效)。

在修改above sample program以使用Fragment而不是ListFragment时,通过删除ListFragment特定的方法调用并对自定义视图进行充气,我得到相同的结果。相关代码归结为:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mAdapter = new AppListAdapter(getActivity());
    getLoaderManager().initLoader(LOADER_ID, null, this);
}

@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    final View v = inflater.inflate(R.layout.list_layout, container, false);
    ListView listView = (ListView) v.findViewById(android.R.id.list);
    listView.setAdapter(mAdapter);
    return v;
}

@Override
public void onLoadFinished(Loader<List<AppEntry>> loader, List<AppEntry> data) {
    mAdapter.setData(data);
}

正如我之前所说,适配器会更新但列表视图根本不会重绘,即使你在listView中添加了notifyDataSetChanged并调用invalidateViews。我发现很难弄清楚这里出了什么问题。

2 个答案:

答案 0 :(得分:1)

原来问题是在onActivityCreated初始化适配器,因为它在 onCreateView之后被称为 - 所以setAdapter传递了一个空值(和它没有抱怨那个)。这不是我所看到的ListFragmentListActivity实现中的问题,因为您可以使用他们的setListAdapter方法将适配器与列表视图相关联,而无需保持自己的显式参考它。一个愚蠢的错误:\

答案 1 :(得分:0)

我之前遇到过类似的问题。我的根似乎没有从ui线程中调用notifyDataSetChanged。您的问题可能类似,请尝试:

yourContext.runOnUiThread(new Runnable() {
    public void run() {
        mAdapter.notifyDataSetChanged();
    }
});

让我知道它是否适合你。