web-dev-qa-db-fra.com

Faites défiler par programme jusqu'à une position spécifique dans un ListView Android

Comment puis-je faire défiler par programme à une position spécifique dans une ListView?

Par exemple, j'ai un String[] {A,B,C,D....} et je dois définir l'élément visible le plus haut de la ListView sur l'index 21 de mon String[].

143
Maxime

Pour un défilement direct:

getListView().setSelection(21);

Pour un défilement lisse:

getListView().smoothScrollToPosition(21);
366
HandlerExploit

Pour un SmoothScroll with Scroll duration:

getListView().smoothScrollToPositionFromTop(position,offset,duration);

Paramètres
position -> Position pour faire défiler jusqu'à
offset ----> Distance souhaitée en pixels de la position à partir du haut de la vue lorsque le défilement est terminé
duration-> Nombre de millisecondes à utiliser pour le défilement

Note: De l'API 11.

La réponse de HandlerExploit était ce que je cherchais, mais ma liste de vues est assez longue et aussi avec alphabet scroller. Ensuite, j'ai trouvé que la même fonction peut prendre d'autres paramètres aussi :)


Edit: (suggestion de l'AFD)

Pour positionner la sélection actuelle:

int h1 = mListView.getHeight();
int h2 = listViewRow.getHeight();

mListView.smoothScrollToPositionFromTop(position, h1/2 - h2/2, duration);  
60
amalBit

Mettez votre code dans handler comme suit,

public void timerDelayRunForScroll(long time) {
        Handler handler = new Handler(); 
        handler.postDelayed(new Runnable() {           
            public void run() {   
                try {
                    lstView.smoothScrollToPosition(YOUR_POSITION);
                } catch (Exception e) {}
            }
        }, time); 
    }

puis appelez cette méthode comme,

timerDelayRunForScroll(100);

À VOTRE SANTÉ!!!

9
Melbourne Lopes

J'ai défini OnGroupExpandListener et substitue onGroupExpand () en tant que:

et utilisez la méthode setSelectionFromTop () qui Définit l'élément sélectionné et positionne la sélection y pixels à partir du bord supérieur de la vue liste. (Si vous êtes en mode tactile, l'élément ne sera pas sélectionné mais il sera toujours positionné correctement.) (Documents Android)

    yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
    {

        @Override
        public void onGroupExpand(int groupPosition) {

            expList.setSelectionFromTop(groupPosition, 0);
            //your other code
        }
    });
6
Inet Labs

Le parchemin Listview sera positionné en haut par défaut, mais vous voulez faire défiler s'il n'est pas visible, utilisez ceci

if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position)
            listView1.setSelection(position);
6
Zalak Gajjar

Manipulation du défilement de la liste à l’aide des boutons HAUT/Bas.

Si quelqu'un est intéressé par la gestion de la liste, affichez une rangée vers le haut/bas à l'aide du bouton. puis.

public View.OnClickListener onChk = new View.OnClickListener() {
             public void onClick(View v) {

                 int index = list.getFirstVisiblePosition();
                 getListView().smoothScrollToPosition(index+1); // For increment. 

}
});
4
Xar E Ahmer

Si quelqu'un recherche une fonctionnalité similaire à celle de l'application Gmail,

Le défilement Listview sera positionné en haut par défaut. Merci pour l'allusion. amalBit .. Il suffit de le soustraire. C'est tout.

 Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            int h1 = mDrawerList.getHeight();
            int h2 = header.getHeight();
            mDrawerList.smoothScrollToPosition(h2-h1);
        }
    }, 1000);
4
Tot

Si vous voulez sauter directement à la position désirée dans une listView, utilisez simplement

listView.setSelection (int position);

et si vous voulez passer facilement à la position souhaitée dans listView, utilisez simplement

listView.smoothScrollToPosition (int position);

3
Vijay

c'est facile list-view.set selection (vous pos); ou vous pouvez enregistrer votre position avec sharedprefrenceand lorsque vous démarrez l'activité. 

1
janatan

C'est ce qui a fonctionné pour moi. Combinaison de réponses par amalBit et Melbourne Lopes

public void timerDelayRunForScroll(long time) {
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() {           
        public void run() {   
            try {
                  int h1 = mListView.getHeight();
                  int h2 = v.getHeight();

                  mListView.smoothScrollToPositionFromTop(YOUR_POSITION, h1/2 - h2/2, 500);  

            } catch (Exception e) {}
        }
    }, time); 
}

puis appelez cette méthode comme:

timerDelayRunForScroll(400);
1

-Si vous voulez juste que la liste défile vers le haut\dawn à une position spécifique:

myListView.smoothScrollToPosition(i);

-si vous voulez obtenir la position d'un élément spécifique dans myListView:

myListView.getItemAtPosition(i);

-aussi ce myListView.getVerticalScrollbarPosition(i);can peut vous aider.

Bonne chance :)

0
Basil Rawa