9

我的问题:每当我通过其(自定义)SimpleCursorAdapter 更新其内容时,我的 ListView 会将其滚动位置重置为顶部。我希望 ListView 在更新时保持其滚动位置。

我开始时每次都创建一个新的适配器实例并使用ListView.setAdapter(),但根据这个讨论,我应该更新适配器而不是重置它。我找不到可以正常工作的 SimpleCursorAdapter 的方法。

以下是我尝试过的一些事情,省略了方法参数:
-SimpleCursorAdapter.changeCursorAndColumns()使用新光标成功更新了适配器,但仍重置了滚动位置。
-SimpleCursorAdapter.changeCursor()行为相同。
-SimpleCursorAdapter.swapCursor()直到 api 11 才可用,我正在为 api 8 开发。
-SimpleCursorAdapter.notifyDataSetChanged()不更新 ListView。(也许我还缺少另一个步骤。)
-ListView.invalidate()不更新 ListView。
-SimpleCursorAdapter.requery()使 ListView 为空白,并且已被弃用。
- 我熟悉ListView.setSelection()解决方案,但我不希望我的 ListView 在更新时移动。这会将其捕捉到列表中的某个位置。

这似乎应该是一个常见且简单的问题。有人处理过吗?

4

2 回答 2

5

我遇到了类似的问题:每当光标的内容发生变化时,我的 CursorAdapter 都会重置滚动位置。

我没有意识到每次数据更改时我确实设置了一个新的列表适配器。我认为光标本身会通知适配器其内容的更改,但在我的情况下,它是 ContentProvider 在我的 ListFragment 中触发 LoaderManager.LoaderCallbacks.onLoadFinished()。在那个回调中,我现在使用 CursorAdapter.changeCursor() 而不是创建一个新的适配器,一切正常。

我希望这有助于解决您的问题。

于 2012-02-22T20:01:16.490 回答
0

在使用以下代码对我有用的 Async Task 的后执行中做了同样的事情

 Cursor cursor = mDataHelper.getWritableDatabase().query(
                        DataContract.Incares.TABLE_NAME,  // Table to Query
                        null, // all columns
                        null, // Columns for the "where" clause
                        null, // Values for the "where" clause
                        null, // columns to group by
                        null, // columns to filter by row groups
                        DataContract.Incares.UUID +" DESC" // sort order
                );
CursorAdapter.changeCursor(cursor);
CursorAdapter.notifyDataSetChanged();

CursorAdapter 是一个全局变量

于 2015-07-19T22:16:18.413 回答