programacion - Android ListView desplazándose hacia arriba
manual android studio avanzado (7)
En algunos requisitos diferentes. Si desea desplazarse hacia arriba al igual que mientras chatea.
mListView.smoothScrollToPosition(mAdapter.getCount());
Tengo un ListView
con filas personalizadas. Cuando se hace clic en cualquiera de estas filas, los datos de ListView se regeneran. Me gustaría que la lista vuelva a la parte superior cuando esto suceda.
Inicialmente intenté usar setSelection(0)
en OnClickListener
cada fila para lograr esto pero no tuve éxito (creo que porque ListView
pierde su posición de desplazamiento cuando sus datos se invalidan, por lo que mi llamada a setSelection se deshace. Todavía no entiendo cómo ListView decide a dónde desplazarse después de la invalidación, sin embargo).
La única solución de trabajo que conozco fue la proporcionada por Romain Guy aquí: http://groups.google.com/group/android-developers/browse_thread/thread/127ca57414035301
Implica ( View.post
) ing la llamada a _listView.setSelection(0)
. Encontré que esto funciona bastante mal. La lista generada recientemente aparece sin cambiar su ubicación de desplazamiento y hay una demora considerable antes de que se desplace de nuevo a la parte superior.
¿Hay alguna forma mejor de lograr esta funcionalidad?
Cualquier ayuda sería muy apreciada.
¡Gracias!
Lo he intentado mucho pero este me funcionó
list.smoothScrollToPosition(0);
Personalmente, te recomiendo que encuentres un patrón de IU diferente. Es posible que los usuarios encuentren intuitivo su enfoque actual de "hacer clic, y la lista cambia in situ ", pero soy escéptico.
Podría intentar subclasificar ListView
y redefinir layoutChildren()
para encadenar a la superclase, luego llamar a setSelection(0)
en el caso de que sea necesario. Si el "retraso considerable" se debe solo a la llamada a la post()
, esto debería aclararla.
Si necesita desplazamiento instantáneo justo después de que se cambiaron los datos del adaptador ListView
, tenga en cuenta que puede que aún no se haya completado. En este caso, debe post()
su setSelection()
o setSelectionAfterHeaderView()
través de Handler
para que se llame más tarde en la cola.
listView.Handler.post(new Runnable() {
@Override
public void run() {
listView.setSelectionAfterHeaderView();
}
});
Esto funcionó para mí.
Simplemente uso listview.setSelection(0);
Funciona bien para mí
call listView.setSelectionAfterHeaderView();
para desplazarse hacia arriba
como solución alternativa, puede crear un nuevo adaptador que contenga los nuevos datos regenerados y luego llamar a ListView.setAdapter. después de esa llamada ListView.setSelection (n).
Por cierto, la solución provista por Commonsware funciona.