Обновите SimpleCursorAdapter, сохраняя положение прокрутки в ListView - PullRequest
9 голосов
/ 13 февраля 2012

Моя проблема: мой 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 ]

5 голосов
/ 23 февраля 2012

У меня была похожая проблема: мой CursorAdapter сбрасывал позицию прокрутки всякий раз, когда содержимое курсора изменялось.

Я не осознавал, что фактически устанавливал новый адаптер списка каждый раз, когда изменялись данные,Я думал, что курсор сам уведомит адаптер об изменениях в его содержимом, но в моем случае именно ContentProvider вызывает LoaderManager.LoaderCallbacks.onLoadFinished () в моем ListFragment.В этом обратном вызове я теперь использую CursorAdapter.changeCursor () вместо создания нового адаптера, и все работает просто отлично.

Надеюсь, это поможет решить вашу проблему.

0 голосов
/ 20 июля 2015

Сделал то же самое при пост-выполнении 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 в качестве глобальной переменной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...