Android ListView с CursorAdapter имеет неправильную позицию прокрутки после вызова Requery при добавлении новых элементов

Вот сценарий: у меня есть простой ListView, отображающий фид Twitter. У меня есть CursorAdapter, который извлекает твиты из sqlite. Когда я вызываю requery() на мой курсор, я ожидаю, что будут получены новые твиты, которые с тех пор были добавлены в базу данных. Все это прекрасно работает, и новые элементы даже видны в ListView после этого.

The Problem is the scroll position seems to be saved based on the item position offset. So let's say the first visible position in my ListView is 4. When I requery and 2 new items are added to the top of the list, the ListView keeps the first visible item scroll position as 4, however since there's two new items in the list, I now see a different item at position 4 than before I refreshed. This image illustrates the before and after: enter image description here

Обратите внимание, что раньше, Tweet D - первый видимый элемент, а затем Tweet B теперь становится первым видимым элементом.

Мой вопрос: как сохранить ту же позицию прокрутки на основе позиционирования курсора при вызове requery, чтобы в этом примере Tweet D все еще был первым видимым элементом после запроса?

7
nl ja de

3 ответы

У меня была аналогичная проблема в одном из моих проектов. Вот как я это решил. Хотя это не совсем тот же случай. Надеюсь, поможет.

Прежде чем обновлять список, сохраните позицию прокрутки таким образом -

int position = getListView().getFirstVisiblePosition();
View v = getListView().getChildAt(0);
int top = v == null ? 0 : v.getTop();

И после того, как вы обновите список, вы узнаете, сколько предметов вы добавили. Таким образом, вы можете позвонить

yourlistview.setSelectionFromTop(position + , top);
3
добавлено
Моя основная проблема заключается в том, что все мои элементы не имеют одинаковой высоты, поэтому прокрутка, как это, может не получить «точную» позицию, в которой она была ранее, например, если элемент наполовину видимый ...
добавлено автор Redth, источник
Вы попробовали? Потому что даже мой список имеет строки переменной высоты. Но работает отлично. int top = v == null? 0: v.getTop (); Эта часть фактически обрабатывает случай, когда элемент наполовину видим.
добавлено автор Sudarshan Bhat, источник

У меня была аналогичная проблема в одном из моих проектов. Вот как я это решил. Хотя это не совсем тот же случай. Надеюсь, поможет.

Прежде чем обновлять список, сохраните позицию прокрутки таким образом -

int position = getListView().getFirstVisiblePosition();
View v = getListView().getChildAt(0);
int top = v == null ? 0 : v.getTop();

И после того, как вы обновите список, вы узнаете, сколько предметов вы добавили. Таким образом, вы можете позвонить

yourlistview.setSelectionFromTop(position + , top);
3
добавлено
Моя основная проблема заключается в том, что все мои элементы не имеют одинаковой высоты, поэтому прокрутка, как это, может не получить «точную» позицию, в которой она была ранее, например, если элемент наполовину видимый ...
добавлено автор Redth, источник
Вы попробовали? Потому что даже мой список имеет строки переменной высоты. Но работает отлично. int top = v == null? 0: v.getTop (); Эта часть фактически обрабатывает случай, когда элемент наполовину видим.
добавлено автор Sudarshan Bhat, источник

Мое предложение состояло в том, чтобы отслеживать количество элементов в списке. Как только вы узнаете, что в рамках обновления вы можете добавить разницу между старым счетом и новым счетчиком.

Код Псевдоэ

on_update

  offset+= (list_view.length() - list_size)
  list_size = list_view.length()
0
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

Xamarin Developers
Xamarin Developers
1 050 участник(ов)

Чат разработчиков приложений на Xamarin для iOS, Android и Windows 10!

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)