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

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

Проблема заключается в том, что положение прокрутки кажется сохраненным на основе смещения позиции элемента. Итак, скажем, первая видимая позиция в моем ListView равна 4. Когда я запрашиваю и 2 новых элемента добавляются в верхнюю часть списка, ListView сохраняет позицию прокрутки первого видимого элемента как 4, однако, поскольку в списке есть два новых элемента , теперь я вижу другой элемент в позиции 4, чем до обновления. Это изображение иллюстрирует до и после: введите описание изображения здесь

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

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


person Redth    schedule 09.01.2013    source источник


Ответы (2)


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

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

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

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

yourlistview.setSelectionFromTop(position + <number of items added>, top);
person Sudarshan Bhat    schedule 10.01.2013
comment
Моя основная проблема заключается в том, что все мои элементы не имеют одинаковой высоты, поэтому такая прокрутка может не получить «точное» положение, в котором оно было ранее, например, если элемент виден наполовину... - person Redth; 15.01.2013
comment
Вы пробовали? Потому что даже в моем списке есть строки переменной высоты. Но работает отлично. int top = v == null ? 0 : v.getTop(); Эта часть фактически обрабатывает случай, когда элемент виден наполовину. - person Sudarshan Bhat; 15.01.2013

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

Псевдокод

on_update

  offset+= (list_view.length() - list_size)
  list_size = list_view.length()
person hdost    schedule 10.01.2013