La detección de la posición de desplazamiento dentro de un ListView (o ScrollView)
-
20-09-2019 - |
Pregunta
Estoy construyendo una aplicación de sala de chat donde los nuevos eventos se sondean para cada X segundos. Cada vez que ocurre, este código se actualiza la RoomAdapter (una subclase personalizada de ArrayAdapter) con los nuevos datos y se desplaza a la parte inferior:
RoomAdapter adapter = (RoomAdapter) getListAdapter();
for (int i=0; i<newEvents.size(); i++)
adapter.add(newEvents.get(i));
getListView().setSelection(events.size()-1);
Esto está bien, excepto que si el usuario se desplaza hasta un vistazo a la historia de la habitación, que va a saltar a bajar hasta el fondo cuando el sondeo sucede. Lo que me gustaría hacer es tener de manera que si el usuario ya se encuentra en la parte inferior de la lista, se queda allí después de una encuesta para nuevos eventos. Si el usuario desplaza intencionadamente hacia arriba, me gustaría que el usuario no ser molestado.
¿Cómo puedo detectar cuando ya estoy desplazado hasta la parte inferior de un ListView?
Nota:. No puedo hacer getListView () getSelectedItemPosition (), porque como los documentos señalan , llamando setSelection cuando está en modo táctil en realidad no seleccione el elemento, simplemente se desplaza a la misma.
Solución
No he probado esto, pero ¿qué hay de getLastVisiblePosition()==getCount()-1
? (Métodos en ListView
)
Otros consejos
Pero eso no es una manera apropiada.
utilice
• android:transcriptMode
- Comportamiento de la lista cuando el contenido cambia
- “desactivado”, no se desplaza
- “normal”, se desplaza a la parte inferior si último elemento es visible
- “alwaysScroll”, siempre se desplaza a la parte inferior
• android:stackFromBottom
- elementos de pila en orden inverso
- Se inicia con el último elemento del adaptador
• Útil para chats
- Mensajería, Talk, IRC, etc.