Подтвердить что ты не робот

Сохранение позиции в ListView после вызова notifyDataSetChanged

Я использую OnScrollListener для динамического добавления элементов в ListView, когда пользователь прокручивается вниз. После добавления данных в адаптер и вызова notifyDataSetChanged, хотя ListView возвращается к вершине. В идеале я хотел бы сохранить позицию в ListView. Любые мысли о том, как я должен это делать?

4b9b3361

Ответ 1

Может ли это быть тем, что вы хотите?

// save index and top position
int index = mList.getFirstVisiblePosition();
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : v.getTop();

// notify dataset changed or re-assign adapter here

// restore the position of listview
mList.setSelectionFromTop(index, top);

EDIT 28/09/2017:

API изменился совсем немного с 2015 года. Это похоже, но теперь это будет:

// save index and top position
int index = mList.FirstVisiblePosition; //This changed
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : v.Top; //this changed

// notify dataset changed or re-assign adapter here

// restore the position of listview
mList.setSelectionFromTop(index, top);

Ответ 2

Ситуация:

Когда вы устанавливаете адаптер в свой список, он обновляет его состояние. Таким образом, обычно автоматически прокручивается.

Решение:

Назначьте адаптер в listview, если он его не имеет, иначе обновите только набор данных назначенного адаптера, а не переустановите его в список.

Подробное руководство объясняется по следующей ссылке:

Android ListView: сохраняйте свою позицию прокрутки при обновлении

Удачи!

Ответ 3

Я реализовал postDelayed, и я стал мерцать при обновлении. Я искал еще кое-что и узнал, что делаю что-то неправильно. В принципе, я не должен создавать новый адаптер каждый раз, когда захочу изменить данные. Я закончил это так, и он работает:

//goes into your adapter
public void repopulateData(String[] objects) {
    this.objects = null;
    this.objects = objects;
    notifyDataSetChanged();
}

//goes into your activity or list
if (adapter == null) {
    adapter = new Adapter();
} else {
    adapter.repopulateData((String[])data);
}

Надеюсь, что это поможет.

Ответ 4

Я использую

listView.getFirstVisiblePosition

для сохранения последней видимой позиции.

Ответ 5

Перейдите в режим транскрипции списка.

Ответ 6

Попробуйте это

      boolean first=true; 
      protected void onPostExecute(Void result) 
      {

      if (first == true) {
      listview.setAdapter(customAdapter);
      first=false;
      }
      else
      customAdapter.notifyDataSetChanged();
      }

Ответ 7

Вот код:

// Save the ListView state (= includes scroll position) as a Parceble
Parcelable state = listView.onSaveInstanceState();

// e.g. set new items
listView.setAdapter(adapter);

// Restore previous state (including selected item index and scroll position)
listView.onRestoreInstanceState(state);