Обновите 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, являющимся глобальной переменной

Другие вопросы по тегам