Posición de retención en ListView después de llamar a notifyDataSetChanged

Estoy usando un OnScrollListener para agregar elementos dinámicamente a un ListView cuando el usuario se desplaza hacia la parte inferior. Después de agregar los datos al adaptador y llamar a notifyDataSetChanged, el ListView vuelve a la parte superior. Idealmente, me gustaría mantener el puesto en ListView. ¿Alguna idea sobre cómo debo hacer esto?

¿Podría ser esto lo que quieres?

// 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 // restre the position of listview mList.setSelectionFromTop(index, top); 

EDITAR 28/09/2017:

La API ha cambiado bastante desde 2015. Es similar, pero ahora sería:

 // 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 // restre the position of listview mList.setSelectionFromTop(index, top); 

La situación:

Cuando configura un adaptador para su vista de lista, actualiza su estado. Por lo tanto, normalmente se desplaza automáticamente.

La solución:

Asigne un adaptador a la vista de lista si no tiene ninguno; de lo contrario, solo actualice el conjunto de datos del adaptador asignado, no lo vuelva a configurar en su vista de lista.

Un tutorial detallado se explica en el siguiente enlace;

Vista de lista de Android: mantenga su posición de desplazamiento cuando actualice

¡Buena suerte!

Implementé PostDelayed y estaba parpadeando al actualizar. Busqué más y descubrí que estaba haciendo las cosas mal. Básicamente, no debería crear un nuevo adaptador cada vez que quisiera cambiar los datos. Terminé haciéndolo de esta manera y funciona:

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

Espero que esto ayude.

estoy usando

listView.getFirstVisiblePosition

para mantener la última posición visible.

Ir con el modo de transcripción de listview.

Prueba esto

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