gpt4 book ai didi

android - 在不更新 ListView 的常规(支持) fragment 中使用 AsyncTaskLoader 更新适配器

转载 作者:行者123 更新时间:2023-11-30 02:28:34 24 4
gpt4 key购买 nike

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

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

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

到目前为止,我看到的所有示例或教程都使用没有自定义布局的 ListFragmentListActivity;我试过了,效果很好。特别是,我尝试了 Android Design Patterns loader tutorial 中的示例程序.不幸的是,我不能使用 ListFragment,因为我使用的是 StickyListHeaders库(但即使尝试使用常规 ListView 也不起作用)。

我在修改 above sample program 时得到相同的结果通过删除特定于 ListFragment 的方法调用并扩展自定义 View ,使用 Fragment 而不是 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 并在 listView 上调用 invalidateViews 也是如此。我发现很难弄清楚这里出了什么问题。

最佳答案

事实证明,问题是在 onActivityCreated 中初始化适配器,因为它被称为 after onCreateView - 所以 setAdapter 被传递了一个空值(并且它没有提示)。这在我看过的 ListFragmentListActivity 实现中不是问题,因为您可以使用它们的 setListAdapter 方法将适配器与 ListView ,而不保留您自己对它的明确引用。一个愚蠢的错误:\

关于android - 在不更新 ListView 的常规(支持) fragment 中使用 AsyncTaskLoader 更新适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27599739/

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