2010-05-22 19 views
75

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 para vuelva a la parte superior cuando esto suceda.Android ListView desplazándose hacia arriba

inicialmente He intentado utilizar setSelection(0) en la OnClickListener cada fila para lograr esto, pero no tuvo éxito (creo que debido a que el ListView pierde su posición de desplazamiento cuando se invalida sus datos -. Por lo que se deshace mi llamada a setSelection todavía don' Sin embargo, entiendo cómo el ListView decide dónde desplazarse después de la invalidación.

La solución única de trabajo que conozco fue dada por Romain tipo aquí: http://groups.google.com/group/android-developers/browse_thread/thread/127ca57414035301

Implica (View.post) ing la llamada a _listView.setSelection(0). I encontró que esto funcionaba bastante mal. La lista recién generada aparece con su ubicación de desplazamiento sin cambios y hay un retraso 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!

Respuesta

4

Personalmente, le recomiendo que busque un patrón de IU diferente. Es posible que los usuarios encuentren su actual "clic, y la lista cambie in situ" enfoque intuitivo, pero soy escéptico.

usted podría tratar de subclases ListView y primordial layoutChildren() a la cadena a la superclase, a continuación, llamar setSelection(0) en el caso en que se necesita. Si el "retraso considerable" se debe solo a la llamada post(), esto debería aclararlo.

+4

Gracias por la sugerencia, voy a intentarlo pronto. La lista se cambia in situ porque las rutas de exploración se muestran en otra parte de la pantalla: los diseños típicos de la interfaz de usuario de Android son menos adecuados para mis objetivos de IU específicos y usuarios objetivo. Además, gracias por TODA su ayuda. He leído varias de sus respuestas de stackoverflow y su literatura de CommonsWare, ¡y me han ayudado significativamente a comenzar en esta plataforma! – aakash

+0

esta es la manera de hacerlo, no hay métodos mágicos, solo lógica pura. ¡Gracias! –

2

Como solución alternativa, puede crear un nuevo adaptador que contenga los nuevos datos regenerados, luego llamar a ListView.setAdapter. después de esa llamada ListView.setSelection (n).

Por cierto, la solución provista por commonsware está funcionando.

120

llamada listView.setSelectionAfterHeaderView(); para desplazarse arriba

+59

eso es exactamente lo que yo hubiera llamado. – markshiz

+0

¡Funcionan muy bien para mí! –

+0

trabajando como amuleto, salvó mi día ... –

39

simplemente uso listview.setSelection(0);

funciona bien para mí.

97

he tratado mucho, pero éste trabajado para mí

list.smoothScrollToPosition(0); 
+3

FYI: Requiere API 8+ – iTurki

+0

@iturki: ya está bien, gracias por mencionarlo. – N20084753

+3

Esto es asombroso. Me pregunto si puedes cambiar la velocidad de desplazamiento. – theblang

5

Si necesita desplazamiento instantáneo justo después de los datos ListView del adaptador se cambió, preste atención a que tal vez no sea todavía poblada. En este caso, debe post() su setSelection() o setSelectionAfterHeaderView() a través de Handler, por lo que se llamará más adelante en la cola.

listView.Handler.post(new Runnable() { 
      @Override 
      public void run() { 
       listView.setSelectionAfterHeaderView();  
      } 
     }); 

Esto funcionó para mí.

1

En algunos requisitos diferentes. Si desea desplazarse hacia arriba al igual que mientras chatea.

 mListView.smoothScrollToPosition(mAdapter.getCount()); 
Cuestiones relacionadas