使用通过LoaderManager加载的数据动态更新列表视图

时间:2014-07-13 15:24:58

标签: java android

在我的应用程序中,我显示了使用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;
}

1 个答案:

答案 0 :(得分:0)

您需要使用上一个光标:incomeAdapter.getCursor()并将其与新的data合并。

MergeCursor帮助你:

Cursor oldData = incomeAdapter.getCursor();
MergeCursor merge = new MergeCursor(new Cursor[] {oldData, data});
incomeAdapter.swapCursor(merge);

修改

您正在使用CursorLoader。您无需重新查询数据库或限制查询。当请求特定数据时,加载程序会为您完成所有这些操作。

Android Docs: Loaders