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

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

Solutions Collecting From Web of "Сохранение позиции в ListView после вызова notifyDataSetChanged"

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

// 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); 

Ситуация:

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

Решение:

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

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

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

Удачи!

Я внедрил 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); } 

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

я использую

listView.getFirstVisiblePosition

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

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

Попробуй это

  boolean first=true; protected void onPostExecute(Void result) { if (first == true) { listview.setAdapter(customAdapter); first=false; } else customAdapter.notifyDataSetChanged(); }