Rilevamento posizione di scorrimento all'interno di una ListView (o ScrollView)
-
20-09-2019 - |
Domanda
Sto costruendo un'applicazione chat room dove i nuovi eventi vengono intervistati per ogni X secondi. Ogni volta che accade, questo codice aggiorna il RoomAdapter (una sottoclasse personalizzata di ArrayAdapter) con i nuovi dati e scorre fino in fondo:
RoomAdapter adapter = (RoomAdapter) getListAdapter();
for (int i=0; i<newEvents.size(); i++)
adapter.add(newEvents.get(i));
getListView().setSelection(events.size()-1);
Questo è bene, tranne che se l'utente scorre fino a sguardo alla storia della stanza, sta andando a saltare la sua fino in fondo quando il sondaggio accade. Quello che mi piacerebbe fare è di avere in modo che se l'utente è già in fondo alla lista, rimane lì dopo un sondaggio per nuovi eventi. Se l'utente intenzionalmente fatto scorrere verso l'alto, mi piacerebbe che l'utente non essere disturbato.
Come faccio a rilevare quando sto già arrotolato al fondo di un ListView?
. Nota: non posso fare getListView () getSelectedItemPosition (), in quanto come la documentazione nota , chiamando setSelection quando è in modalità touch in realtà non selezionare la voce, semplicemente scorre ad esso.
Soluzione
Non ho provato questo, ma come su getLastVisiblePosition()==getCount()-1
? (Metodi su ListView
)
Altri suggerimenti
Ma questo non è un modo corretto.
utilizzare
• android:transcriptMode
- il comportamento della lista quando il contenuto cambia
- “disabile”, non scorre
- “normale”, scorre fino in fondo se ultimo elemento è visibile
- “alwaysScroll”, scorre sempre alla
fondo
• android:stackFromBottom
- gli elementi dello stack in ordine inverso
- Inizia con l'ultimo elemento dall'adattatore
• Utile per le chat
- Messaging, Talk, IRC, ecc