Tengo una ListView
con filas personalizadas. Cuando se hace clic en cualquiera de estas filas, se regeneran los datos de ListView. Me gustaría que la lista volviera a la parte superior cuando esto suceda.
Inicialmente intenté usar setSelection(0)
en cada fila OnClickListener
para lograr esto, pero no tuve éxito (creo que porque ListView
pierde su posición de desplazamiento cuando se invalidan sus datos, por lo que mi llamada a setSelection se deshace. Todavía no entiendo cómo ListView decide dónde desplazarse sin embargo, después de la invalidación).
La única solución de trabajo que conozco fue dada por Romain Guy aquí: http://groups.google.com/group/android-developers/browse_thread/thread/127ca57414035301
Implica ( View.post
) hacer la llamada a _listView.setSelection(0)
. Encontré que esto funcionaba bastante mal. La lista recién generada aparece con su ubicación de desplazamiento sin cambios y hay una demora considerable antes de que vuelva a la parte superior.
¿Existe alguna forma mejor de lograr esta funcionalidad?
Cualquier ayuda será muy apreciada.
¡Gracias!
He intentado mucho, pero este funcionó para mí.
list.smoothScrollToPosition(0);
fuente
Yo simplemente uso
listview.setSelection(0);
Funciona bien para mi.
fuente
Si necesita un desplazamiento instantáneo justo después
ListView
de cambiar los datos del adaptador, preste atención a que es posible que aún no se haya completado. En este caso, debepost()
susetSelection()
osetSelectionAfterHeaderView()
viaHandler
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í.
fuente
Personalmente, te recomiendo que encuentres un patrón de interfaz de usuario diferente. Es posible que los usuarios encuentren su enfoque actual de "clic, y la lista cambia in situ " intuitivo, pero soy escéptico.
Puede intentar subclasificar
ListView
y anularlayoutChildren()
para encadenar a la superclase, luego llamarsetSelection(0)
en el caso que sea necesario. Si el "retraso considerable" se debe sólo a lapost()
llamada, esto debería aclararlo.fuente
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 proporcionada por commonsware está funcionando.
fuente
En algún requisito diferente. Si desea desplazarse hacia arriba como si estuviera chateando.
mListView.smoothScrollToPosition(mAdapter.getCount());
fuente
Este funcionó bien cuando desea enfocar el texto de edición del encabezado de la vista de lista
listview.setSelectionFromTop(0,0);
Si desea seleccionar la vista de índice particular de la vista de lista, entonces
listview.setSelection(index); // o for top
fuente