J'ai un ListView
avec des lignes personnalisées. Lorsque vous cliquez sur l'une de ces lignes, les données du ListView sont régénérées. Je voudrais que la liste revienne au début lorsque cela se produit.
J'ai initialement essayé d'utiliser setSelection(0)
dans la OnClickListener
de chaque ligne pour y parvenir, mais sans succès (je crois que la ListView
Perd sa position de défilement lorsque ses données sont invalidées - mon appel à SetSelection est donc annulé. Je continue ne comprends pas comment ListView .__ décide où faire défiler après l’invalidation).
La seule solution de travail que je connaisse a été donnée par Romain Guy ici: http://groups.google.com/group/Android-developers/browse_thread/thread/127ca57414035301
Cela implique (View.post
) l'appel à _listView.setSelection(0)
. J'ai trouvé que cela fonctionnait plutôt mal… La liste nouvellement générée apparaît avec son emplacement de défilement inchangé. Il y a un délai considérable avant qu'elle ne revienne au début.
Existe-t-il un meilleur moyen de réaliser cette fonctionnalité?
Toute aide serait très appréciée.
Merci!
appelez listView.setSelectionAfterHeaderView();
pour faire défiler vers le haut
J'ai essayé beaucoup mais celui-ci a fonctionné pour moi
list.smoothScrollToPosition(0);
J'utilise simplement listview.setSelection(0);
Fonctionne bien pour moi.
Si vous avez besoin d'un défilement instantané juste après la modification des données de l'adaptateur ListView
, faites attention à ce qu'elles ne soient peut-être pas encore remplies. Dans ce cas, vous devriez post()
votre setSelection()
ou setSelectionAfterHeaderView()
via Handler
pour qu’elle soit appelée ultérieurement dans la file d’attente.
listView.Handler.post(new Runnable() {
@Override
public void run() {
listView.setSelectionAfterHeaderView();
}
});
Cela a fonctionné pour moi.
Personnellement, je vous recommande de trouver un modèle d'interface utilisateur différent. Il est possible que les utilisateurs trouvent votre "clic actuel" et que la liste change in situ "soit une approche intuitive, mais je suis sceptique.
Vous pouvez essayer de sous-classer ListView
et de remplacer layoutChildren()
pour le chaîner à la super-classe, puis d'appeler setSelection(0)
dans le cas où cela serait nécessaire. Si le "retard considérable" est uniquement dû à l'appel post()
, le problème devrait être résolu.
pour contourner le problème, vous pouvez créer un nouvel adaptateur contenant les nouvelles données régénérées, puis appeler ListView.setAdapter. après cet appel, ListView.setSelection (n).
bTW, la solution fournie par le commonsware est travaillée.
Si vous souhaitez faire défiler l'écran tout comme lors d'une discussion.
mListView.smoothScrollToPosition(mAdapter.getCount());
Celui-ci a bien fonctionné lorsque vous voulez concentrer l'edittext de l'en-tête listview
listview.setSelectionFromTop(0,0);
Si vous souhaitez sélectionner la vue d'index particulière à partir de listview, puis
listview.setSelection(index); // o for top