【发布时间】:2016-04-22 02:02:39
【问题描述】:
正如标题所说,当尝试对由SimpleCursorAdapter 和CursorLoader 支持的ListView 进行分页时,旧游标正在关闭,因此会引发以下异常。前两页加载得很好(第一页没有使用MergeCursor,第二页是第一页使用MergeCursor)。我不会在任何光标上调用任何close()。
有趣的是,在调试时,我看不到任何游标上的关闭标志被设置为真,因为它的价值。那可能是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)
{
}
【问题讨论】:
标签: android loader simplecursoradapter android-cursor android-cursorloader