web-dev-qa-db-fra.com

Android ListView défilement vers le haut

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!

77
aakash

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

127
D. B.

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

list.smoothScrollToPosition(0);
100
N20084753

J'utilise simplement listview.setSelection(0);

Fonctionne bien pour moi.

39
radhoo

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.

5
Dmitry Polomoshnov

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.

4
CommonsWare

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.

2
shaobin0604

Si vous souhaitez faire défiler l'écran tout comme lors d'une discussion. 

        mListView.smoothScrollToPosition(mAdapter.getCount());
1
Fahad

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
0
Sampath Kumar