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
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);
}
});
}
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" />
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);
}
});
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);
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
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
.
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
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?
La solution la plus simple est:
listView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
listView.setStackFromBottom(true);