web-dev-qa-db-fra.com

Listview Défiler jusqu'à la fin de la liste après la mise à jour de la liste

Je voudrais m'assurer que la liste défile jusqu'en bas, après avoir mis à jour la liste en utilisant listAdapter, afin qu'elle affiche le dernier élément entré dans la liste. Comment puis-je faire ceci ?

J'ai essayé ça mais pas de chance:

lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

merci

283
jramirez

En supposant que vous sachiez quand les données de la liste ont été modifiées, vous pouvez indiquer manuellement à la liste de faire défiler l'écran jusqu'en bas en définissant la sélection de liste sur la dernière ligne. Quelque chose comme:

private void scrollMyListViewToBottom() {
    myListView.post(new Runnable() {
        @Override
        public void run() {
            // Select the last row so it will scroll into view...
            myListView.setSelection(myListAdapter.getCount() - 1);
        }
    });
}
408
Mason Lee

Vous devez utiliser ces paramètres dans votre vue liste:

  • Faites défiler lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

  • Placez la tête de la liste en bas lv.setStackFromBottom(true);

Vous pouvez également définir ces paramètres en XML, par exemple. comme ça:

<ListView
   ...
   Android:transcriptMode="alwaysScroll"
   Android:stackFromBottom="true" />
234
dev.serghini

Une combinaison de TRANSCRIPT_MODE_ALWAYS_SCROLL et de setSelection a fonctionné pour moi

ChatAdapter adapter = new ChatAdapter(this);

ListView lv = (ListView) findViewById(R.id.chatList);
lv.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
lv.setAdapter(adapter);

adapter.registerDataSetObserver(new DataSetObserver() {
    @Override
    public void onChanged() {
        super.onChanged();
        lv.setSelection(adapter.getCount() - 1);    
    }
});
36
Wärting

J'ai réussi à utiliser ceci en réponse à un clic de bouton, alors je suppose que vous pouvez aussi l'utiliser après la mise à jour de votre contenu:

myListView.smoothScrollToPosition(theListAdapter.getCount() -1);
28
Álex

Pour obtenir cela dans un ListFragment:

getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); 
getListView().setStackFromBottom(true);`

Ajout de cette réponse parce que si quelqu'un fait une recherche google pour le même problème avec ListFragment, il le trouve juste ..

Cordialement

10
Klatschen

Utilisation: Définir l’en-tête de la liste en bas lv.setStackFromBottom(true);

Travaillé pour moi et la liste est défilée vers le bas automatiquement dès sa première apparition. La liste défile alors comme il se doit avec TRANSCRIPT_MODE_ALWAYS_SCROLL.

9
Kevin Parker

J'utilise

setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);

pour ajouter des entrées en bas, et les anciennes entrées défilent en haut, comme une transcription de discussion

6
Plugie

Le mode de transcription correspond à vos besoins et est utilisé par Google Talk et l’application SMS/MMS. Appelez-vous correctement notifyDatasetChanged () sur votre adaptateur lorsque vous ajoutez des éléments?

3
Romain Guy

La solution la plus simple est:

    listView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
    listView.setStackFromBottom(true);
3
ucMedia