2

我发现我的 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...?

4

1 回答 1

4

只要您使用fragment.getLoader(),您的加载器就可以在不同的片段中拥有相同的ID。更深入地遵循 ASOP 代码,您会看到

mLoaderManager = mActivity.getLoaderManager(mIndex, mLoadersStarted, true);

调用一个包私有方法,该方法从加载器的 ArrayMap 中获取加载器。mIndex(片段的唯一字符串)是该 ArrayMap 的索引,并且对于片段是唯一的。查看 getLoader() 的 Activity 实现,您会看到它是这样做的:

mLoaderManager = mActivity.getLoaderManager("(root)", mLoadersStarted, true);

显然 Activity 有它自己的加载器,以及每个片段。问题出在代码的其他地方。

于 2015-05-15T15:30:05.233 回答