在我的应用程序中,我显示了使用Loader Manager和Content Provider从数据库中查询的项目列表。结果附加到SimpleCursorAdapter,然后显示在列表视图上。我希望能够加载,首先让我们说最多20个项目,当滚动到该列表的末尾时,加载另外20个项目。到目前为止,我使用了类似的方法:
How to update listview whose data was queried from database through SimpleCursorAdapter?
即。将查询结果限制为20并在OnScrollListener中适当增加数量,并使用新指令重新启动加载程序。 问题在于这句话:
incomeAdapter.swapCursor(data);
它完全重置适配器的数据,因此列表中只显示第二批项目。有没有办法简单地在现有项目之上加载其他项目?感谢
编辑: 合并这样的游标:
if (incomeAdapter.getCursor() != null){
Log.v("Income Activity", "current adapter");
Cursor oldData = incomeAdapter.getCursor();
MergeCursor merge = new MergeCursor(new Cursor[] {oldData, data});
incomeAdapter.swapCursor(merge);
}
else {
Log.v("Income Activity", "no current adapter");
incomeAdapter.swapCursor(data);
}
抛出异常:
07-13 16:56:15.455: E/AndroidRuntime(5665): FATAL EXCEPTION: main
07-13 16:56:15.455: E/AndroidRuntime(5665): android.database.StaleDataException:
Attempting to access a closed CursorWindow.Most probable cause: cursor is deactivated
prior to calling this method.
EDIT2: 根据请求,请求数据的代码:
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
orderBy = sortOrder + " LIMIT " + limitSkip + "," + limitCount;
CursorLoader cursorLoader = new CursorLoader(this,
DatabaseProvider.CONTENT_URI1, PROJECTION, null, null, orderBy);
return cursorLoader;
}
答案 0 :(得分:0)
您需要使用上一个光标:incomeAdapter.getCursor()
并将其与新的data
合并。
MergeCursor帮助你:
Cursor oldData = incomeAdapter.getCursor();
MergeCursor merge = new MergeCursor(new Cursor[] {oldData, data});
incomeAdapter.swapCursor(merge);
修改强>:
您正在使用CursorLoader。您无需重新查询数据库或限制查询。当请求特定数据时,加载程序会为您完成所有这些操作。