android - 使用 CursorLoader 和 MergeCursor 的分页关闭旧游标

标签 android loader simplecursoradapter android-cursor android-cursorloader

正如标题所说,当尝试对由 SimpleCursorAdapterCursorLoader 支持的 ListView 进行分页时,旧游标将被关闭,因此抛出以下异常。前 2 个页面加载得很好(第一个没有使用 MergeCursor,第二个页面是第一个使用 MergeCursor 的页面)。我不会在任何游标上调用任何 close()

有趣的是,在调试时,我看不到任何游标上的关闭标志被设置为 true,这是值得的。可能是 MergeCursor 的问题。让我知道你们是否有任何解决方案,我没有想法。

堆栈跟踪:

android.database.StaleDataException: Attempting to access a closed CursorWindow.Most probable cause: cursor is deactivated prior to calling this method.
    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:139)
    at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:74)

代码:

private List<Cursor> mCursorsList = new ArrayList<>();

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
                     int visibleItemCount, int totalItemCount)
{
    if (!isLoading && !isAllLoaded &&
            firstVisibleItem != 0 &&
            firstVisibleItem == totalItemCount - visibleItemCount)
        getActivity().getSupportLoaderManager().restartLoader(LOADER_ID, null, this);
}

@Override
public void onLoadFinished(Loader<Cursor> loader, final Cursor data)
{
        Cursor oldCursor = mCursorAdapter.getCursor();
        mCursorsList.add(data);
        if (oldCursor != null)
        {
            Cursor[] cursorArray = mCursorsList.toArray(new Cursor[mCursorsList.size()]);
            MergeCursor newCursor = new MergeCursor(cursorArray);
            mCursorAdapter.swapCursor(newCursor);
        }
        else // first cursor
        {
            mCursorAdapter.swapCursor(data);
        }
}

@Override
public void onLoaderReset(Loader<Cursor> loader)
{
}

最佳答案

这个问题的主要原因是 CursorLoader 管理内部游标,所以每当它需要打开一个新游标(例如新页面查询)时,它就会关闭旧游标。

对于更简单的分页实现,不要使用偏移量查询,只需在每一页上增加限制,以便新游标也包含所有以前的页面。此外,正如 Ian Lake 在 Google+ 上建议的那样,有时您甚至不需要分页,尤其是当您进行复杂的连接或对数据进行排序时。

关于android - 使用 CursorLoader 和 MergeCursor 的分页关闭旧游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34828657/

相关文章:

android - 我如何在锁定屏幕上显示对话框,如 viber 或 Line messenger

创建加载动画

clr - CorFlags.exe/32BIT+ 如何工作?

java - notifyDataSetChanged() 在 ListFragment 中不起作用

android - 房间查询 : find within list is always returning null

android - 有什么方法可以在可观察对象发出任何项目之前执行代码? (用于重试目的)

actionscript-3 - 在AS3中加载SWF,但Flash会不断重复构造函数,该怎么办?

listview - ContentResolver$CursorWrapperInner 无法转换

android - 在堆栈跟踪中没有应用程序代码的 ListView 中滚动时的 IndexOutOfBounds

android - 为什么我的 config.xml 文件似乎没有被 Cordova 3.0.9 CLI 正确更新,我应该自己手动更新它们吗?