Обновите SimpleCursorAdapter, сохраняя положение прокрутки в ListView
Моя проблема: мой ListView сбрасывает свою позицию прокрутки в верхнюю часть всякий раз, когда я обновляю его содержимое через его (настраиваемый) SimpleCursorAdapter. Я хотел бы, чтобы 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 вообще перемещался при обновлении. Это привязывает его к позиции в списке.
Кажется, это должно быть обычной и простой проблемой. Кто-нибудь имел дело с этим?
2 ответа
У меня была похожая проблема: мой CursorAdapter сбрасывал положение прокрутки всякий раз, когда содержимое курсора изменялось.
Я не осознавал, что на самом деле устанавливал новый адаптер списка каждый раз, когда менялись данные. Я думал, что курсор сам уведомит адаптер об изменениях в его содержимом, но в моем случае именно ContentProvider вызывает LoaderManager.LoaderCallbacks.onLoadFinished() в моем ListFragment. В этом обратном вызове я теперь использую CursorAdapter.changeCursor() вместо создания нового адаптера, и все работает просто отлично.
Я надеюсь, что это помогает решить вашу проблему.
Сделал то же самое в пост выполнения 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, являющимся глобальной переменной