2011-08-04 19 views
20

Tengo un adaptador personalizado para una configuración de ListView y funciona bien. En un botón, haga clic en algo se cambia en los datos subyacentes, por lo que se requiere notifyDataSetChanged para actualizar ListView. Multa. Pero también quiero que ListView se desplace a la línea donde ocurrió el cambio. Para esto llamo smoothScrollToPosition inmediatamente después de notifyDataSetChanged. Y eso no está funcionando.smoothScrollToPosition después de notifyDataSetChanged no funciona en android

Si no llamo notifyDataSetChanged, el desplazamiento funciona, por lo que la notificación bloquea el desplazamiento. Probablemente estoy peleando con eventos procesados ​​en el futuro. ¿Alguien puede darme una indicación de lo que está pasando mal?

+1

Un poco de información adicional; este comportamiento ocurre en el emulador. Cuando se ejecuta en un teléfono, la situación es mixta; algunas veces el rollo funciona y otras no. Parece que se trata de si la notificación ha finalizado antes de que se complete el proceso. O tal vez en qué orden. – tbeernot

Respuesta

78

Utilice el método post() que esperar a que la lista de terminar la actualización después de llamar notifyDataSetChanged():

adapter.notifyDataSetChanged(); 
list.post(new Runnable() { 
    @Override 
    public void run() { 
    //call smooth scroll 
    } 
    }); 
+0

¡Gracias! Esto funciona. En el emulador, la lista salta hasta el final y luego a donde le dije que fuera, pero en un teléfono no está visible. – tbeernot

+0

En teoría, la lista debe permanecer en la misma posición que antes de 'notifyDatasetChanged()', por lo que si actualizas con menos elementos, primero iría al final. – dmon

+0

Las pruebas muestran que notifyDatasetChanged hace que la lista siempre salte al final, smoothScrollToPosition lo hace saltar para que la entrada esté en la parte superior. En el emulador esto es claramente visible, en un teléfono real la lista es "inquieta" y hay acción cuando no se requiere ninguna. – tbeernot

0

He tratado de código de ejemplo del DMON y veo que no siempre trabajando.

De hecho, he encontrado otro enfoque para llevar a cabo el desplazamiento:

adapter.notifyDataSetChanged(); 
channelsListView.setSelection(scrollPos); // it works without smoothScrollToPositionFromTop(..) or smoothScrollToPosition() methods call. 

me encontré con la idea principal de utilizar el método anterior después de esta lectura respuesta: https://stackoverflow.com/a/20997828/2133585

Cuestiones relacionadas