我有非常简单的带有 ListView、CursorLoader 和 CursorAdapter 的片段。一切都在单个活动中(只是切换片段)。我的问题是 onLoadFinished() 在某些情况下会根据我调用 initLoader() 的位置被调用两次。这些情况是:
- 配置更改(旋转屏幕等)
- 使用 FragmentTransaction 将当前片段替换为另一个片段,然后返回(弹出回栈)。在这种情况下,一个列表项的详细信息片段。
当 initLoader() 放入 onCreateView() 时,onActivityCreated()(文档中推荐) onLoadFinished() 在配置更改后被调用两次。Rudik Krasniynos解释了原因。但是 onLoadFinished() 从 backstack 弹出更新的片段时只调用一次。
当 initLoader() 放在 onResume()/onStart() 方法中时,上面的情况是相反的。两次调用 onLoadFinished() 用于弹出回栈,一次调用用于更改配置。
所以问题是在哪里或如何在不调用 onLoadFinished() 两次的情况下初始化 Loader,或者检查什么以不两次初始化 Loader。谢谢!
替换片段的代码:
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.root_view, fragment, tag);
ft.addToBackStack(null);
ft.commit();
CursorAdapter 的代码:
//onCreateView
MyCursorAdapter mAdapter = new MyCursorAdapter(getActivity(), null, 0);
mList.setAdapter(mAdapter);
//in other/same lifecycle callbacks
getLoaderManager().initLoader(ID, null, this);
我正在使用支持库 v18。