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

Android 在不更新ListView的常规(支持)片段中使用AsyncTaskLoader更新适配器,android,android-fragments,android-listview,android-listfragment,android-loader,Android,Android Fragments,Android Listview,Android Listfragment,Android Loader,使用AsyncTaskLoader回调更新常规片段中的适配器时遇到问题。我正在使用片段支持库,版本19.1.0 在我的onLoadFinished()回调中,我只需执行mAdapter.addAll(data)。我使用调试器来验证是否调用了回调,以及是否已将所有数据添加到适配器。问题是列表视图根本不会更新 我已经尝试了notifyDataSetChanged()和invalidateViews()-没有效果 到目前为止,我看到的所有示例或教程都使用了ListFragment或ListActivi

使用
AsyncTaskLoader
回调更新常规
片段中的适配器时遇到问题。我正在使用片段支持库,版本19.1.0

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

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

到目前为止,我看到的所有示例或教程都使用了
ListFragment
ListActivity
,没有自定义布局;我试过这个,效果很好。特别是,我尝试了来自的示例程序。不幸的是,我不能使用
ListFragment
,因为我正在使用库(但即使使用常规的
ListView
也不行)

通过删除特定于
ListFragment
的方法调用并扩大自定义视图,修改以使用
Fragment
而不是
ListFragment
时,我得到了相同的结果。相关代码归结为:

@覆盖
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
mAdapter=newapplistadapter(getActivity());
getLoaderManager().initLoader(LOADER_ID,null,this);
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
最终视图v=充气机充气(R.layout.list_布局,容器,假);
ListView ListView=(ListView)v.findViewById(android.R.id.list);
setAdapter(mAdapter);
返回v;
}
@凌驾
public void onLoadFinished(加载程序,列表数据){
mAdapter.setData(数据);
}

如前所述,适配器会得到更新,但列表视图不会重新绘制,即使您添加了notifyDataSetChanged并在listView上调用invalidateViews。我发现很难找出这里出了什么问题。

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

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

让我知道它是否对您有效。

结果表明,问题是在
onActivityCreated
中初始化适配器,正如在
onCreateView
之后调用的那样-因此
setAdapter
被传递了一个空值(它不会对此抱怨)。这在我看过的
ListFragment
ListActivity
实现中不是问题,因为您可以使用它们的
setListAdapter
方法将适配器与列表视图关联,而无需保留自己对它的显式引用。一个愚蠢的错误:\

那么你的适配器代码是什么?事实上,我们需要查看你的适配器代码-如果视图没有更新,那么适配器很可能是罪魁祸首。我只是想澄清一下,我的意思是ListView仍然为空,适配器中的任何项目都不会显示。可以找到上面示例使用的适配器的代码。可以找到我正在使用的实际应用程序的适配器代码。行为没有改变,ListView仍然没有显示任何内容。我相信LoaderManager回调应该在UI线程上调用。嗯,也许可以尝试将大部分listview逻辑放在UI线程中。您是否可以将适配器代码复制粘贴到问题编辑器中?