我发现我的CursorLoader回调正在混淆游标。
问题似乎是那个
Fragment.getLoaderManager()与getActivity()是相同的加载器ID范围.getSupportLoaderManager()
来自AOSP
public LoaderManager getLoaderManager() {
if (mLoaderManager != null) {
return mLoaderManager;
}
if (mActivity == null) {
throw new IllegalStateException("Fragment " + this + " not attached to Activity");
}
mCheckedForLoaderManager = true;
mLoaderManager = mActivity.getLoaderManager(mIndex, mLoadersStarted, true);
return mLoaderManager;
}
所以我所经历的是我的片段中的ID冲突,所以错误的游标希望跨越片段。
我需要一个策略来创建静态和/或动态(在动态数量的加载器的情况下)id,它们知道所有其他碎片ID ...?
答案 0 :(得分:4)
只要您使用fragment.getLoader(),就可以在装载程序的不同片段中使用相同的ID。更深入地遵循ASOP代码,您将看到
mLoaderManager = mActivity.getLoaderManager(mIndex, mLoadersStarted, true);
调用一个包私有方法,该方法从加载器的ArrayMap获取一个加载器。 mIndex(片段的唯一字符串)是该ArrayMap的索引,对片段是唯一的。查看getLoader()的Activity实现,您将看到它执行此操作:
mLoaderManager = mActivity.getLoaderManager("(root)", mLoadersStarted, true);
显然,Activity拥有自己的加载器以及每个片段。问题出在代码中的其他地方。