80 votes

Android ListView défilement vers le haut

J'ai un ListView personnalisée avec des lignes. Lorsque l'une de ces lignes est cliqué, la liste des données est régénéré. Je voudrais la liste de faites défiler vers le haut lorsque cela se produit.

J'ai d'abord essayé d'utiliser setSelection(0) dans chaque ligne, OnClickListener pour atteindre cet objectif, mais a échoué (je crois parce que l' ListView perd sa position de défilement lorsque ses données sont invalidés - donc mon appel à l' setSelection est annulée. Je ne comprends toujours pas comment la ListView décide où faites défiler jusqu'à après l'invalidation, tout de même).

La seule solution de travail, je sais de a été donné par Romain Guy ici: http://groups.google.com/group/android-developers/browse_thread/thread/127ca57414035301

Il implique (View.post)ing l'appel à _listView.setSelection(0). J' trouvé pour faire assez mal. La nouvelle liste générée s'affiche avec son défilement emplacement inchangé et il y a un retard considérable avant qu'il défile en arrière vers le haut.

Est-il meilleure façon d'obtenir cette fonctionnalité?

Toute aide serait grandement appréciée.

Merci!

132voto

D. B. Points 669

appelez listView.setSelectionAfterHeaderView(); pour faire défiler vers le haut

102voto

N20084753 Points 986

J'ai essayé beaucoup mais celui-ci a fonctionné pour moi

 list.smoothScrollToPosition(0);
 

42voto

radhoo Points 1185

J'utilise simplement listview.setSelection(0);

Fonctionne bien pour moi.

4voto

CommonsWare Points 402670

Personnellement, je vous recommande de trouver un modèle d'interface utilisateur différent. Il est possible que les utilisateurs trouvent votre approche actuelle du "clic, et la liste change in situ " intuitive, mais je suis sceptique.

Vous pouvez essayer de sous-classer ListView et de remplacer layoutChildren() par la chaîne, puis d'appeler setSelection(0) dans le cas où cela serait nécessaire. Si le "retard considérable" est uniquement dû à l'appel post() , cela devrait le clarifier.

2voto

shaobin0604 Points 525

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X