我的问题:每当我通过其(自定义的)SimpleCursorAdapter更新其内容时,我的ListView会将其滚动位置重置为顶部。我希望ListView在更新时保持其滚动位置。
我开始时每次都使用ListView.setAdapter()
创建一个新的适配器实例,但根据this discussion我应该更新适配器而不是重置它。我无法找到一种方法来为SimpleCursorAdapter正常工作。
以下是我尝试过的一些事情,省略了方法论点:
- SimpleCursorAdapter.changeCursorAndColumns()
使用新光标成功更新适配器,但仍会重置滚动位置
- SimpleCursorAdapter.changeCursor()
以同样的方式行事
- SimpleCursorAdapter.swapCursor()
直到api 11才可用,我正在为api 8开发。
- SimpleCursorAdapter.notifyDataSetChanged()
不更新ListView。 (也许我还缺少另一个步骤。)
- ListView.invalidate()
不会更新ListView
- SimpleCursorAdapter.requery()
将ListView设为空白,不推荐使用
- 我熟悉ListView.setSelection()
解决方案,但我不希望我的ListView在更新时完全移动。这会将其捕捉到列表中的某个位置。
这似乎应该是一个普通而简单的问题。有人处理过吗?
答案 0 :(得分:5)
我遇到了类似的问题:只要光标内容发生变化,我的CursorAdapter就会重置滚动位置。
我没有意识到每次数据更改时我确实设置了一个新的列表适配器。我认为光标本身会通知适配器有关其内容的更改但在我的情况下是ContentProvider在我的ListFragment中触发LoaderManager.LoaderCallbacks.onLoadFinished()。在该回调中,我现在使用CursorAdapter.changeCursor()而不是创建一个新的适配器,一切正常。
我希望这有助于解决您的问题。
答案 1 :(得分: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.swapCursor(cursor);
CursorAdapter.notifyDataSetChanged();
使用CursorAdapter作为全局变量