在ListView中保持滚动位置的同时更新SimpleCursorAdapter

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

我开始创build一个新的适配器实例,每次使用ListView.setAdapter() ,但根据这个讨论,我应该更新适配器,而不是重置它。 我无法find一种方法来正确工作的SimpleCursorAdapter。

以下是我尝试过的一些东西,省略了方法参数:
– 带有新光标的SimpleCursorAdapter.changeCursorAndColumns()成功更新适配器,但仍然重置滚动位置。
SimpleCursorAdapter.changeCursor()行为方式相同。
SimpleCursorAdapter.swapCursor()不可用,直到API 11,我正在开发的API 8。
SimpleCursorAdapter.notifyDataSetChanged()不会更新ListView。 (也许我错过了另一个步骤。)
ListView.invalidate()不会更新ListView。
SimpleCursorAdapter.requery()使ListView SimpleCursorAdapter.requery()空白,不推荐使用。
– 我熟悉ListView.setSelection()解决scheme,但我不希望我的ListView在更新时完全移动。 这将它捕捉到列表中的一个位置。

这似乎应该是一个普遍而简单的问题。 有人处理了吗?

Solutions Collecting From Web of "在ListView中保持滚动位置的同时更新SimpleCursorAdapter"

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

我没有意识到,我实际上每次数据更改时都设置了新的列表适配器。 我以为游标自己会通知适配器有关其内容的变化,但在我的情况下,它是在我的ListFragment中触发LoaderManager.LoaderCallbacks.onLoadFinished()的ContentProvider。 在callback中,我现在使用CursorAdapter.changeCursor()而不是创build一个新的适配器,一切正常。

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

asynchronous任务使用下面的代码后执行同样为我工作

  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.swapCursor(cursor); CursorAdapter.notifyDataSetChanged(); 

CursorAdapter是一个全局variables