Я использую OnScrollListener для динамического добавления элементов в ListView, когда пользователь прокручивается вниз. После добавления данных в адаптер и вызова notifyDataSetChanged, хотя ListView возвращается к вершине. В идеале я хотел бы сохранить позицию в ListView. Любые мысли о том, как я должен это делать?
Сохранение позиции в ListView после вызова notifyDataSetChanged
Ответ 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);