【发布时间】:2013-05-22 20:27:51
【问题描述】:
我发现我的 CursorLoader 回调混淆了光标。
问题似乎是这样的
Fragment.getLoaderManager() 与 getActivity().getSupportLoaderManager() 的加载器 id 范围相同
来自 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...?
【问题讨论】:
-
你能举一个更具体的例子来说明你遇到的问题吗?确实,如果您查看源代码,
Fragments 共享相同的底层加载器管理器实例,但您仍然应该能够区分每个片段的不同加载器集(即使它们具有相同的 id)。 -
例如说我有一个片段加载一个特定的数据表,可能有不同的过滤器。我在同一个活动(多窗格)中有两个相同片段的实例。如果我将 loader id 设置为 0,那么两者都为零,并且光标回调会变得混乱。
-
只是仔细检查...您是否在您的
FragmentsonCreate()方法中调用了initLoader()?确保你不要那样做。而是在onActivityCreated()中初始化片段的加载器。 -
是的,我正在这样做,问题在于提供唯一的加载程序 ID。我唯一能想到的可能是让片段向活动询问未使用的加载程序 ID 并存储它。但我认为加载程序 ID 需要在活动破坏时保持稳定,例如。回转。也许需要比在整个应用程序中幸存的某种单例更高的东西,考虑到范围只是活动,这是矫枉过正的,但它是唯一能够在活动破坏后幸存下来的东西,保持稳定的 ID,但也提供动态 ID一些布局需要...
-
您应该能够使用包含相同 ID 的加载器拥有多个片段,并且不会出现任何问题。我认为您的代码有问题导致回调混淆...
标签: android android-fragments android-loadermanager android-cursorloader