Comment obtenir le numéro de page actuel d'un ViewPager pour Android?

84

Je souhaite connaître la position actuelle de la page ViewPager. Je crée un adaptateur et définit cet adaptateur sur le ViewPager. Maintenant, je veux connaître le numéro de page actuel ou la position de la vue actuelle, car je veux démarrer des événements supplémentaires sur cette page particulière.

J'ai utilisé viewPager.setCurrentItem(1);pour régler le premier élément.

Existe-t-il une méthode similaire pour obtenir la page actuelle?

sam_k
la source

Réponses:

180

dans les derniers packages, vous pouvez également utiliser

vp.getCurrentItem()

ou

vp est le viewPager,

pageListener = new PageListener();
vp.setOnPageChangeListener(pageListener);

vous devez mettre un écouteur de changement de page pour votre viewPager. Il n'y a pas de méthode sur viewPager pour obtenir la page actuelle.

private int currentPage;

    private static class PageListener extends SimpleOnPageChangeListener{
            public void onPageSelected(int position) {
                Log.i(TAG, "page selected " + position);
                   currentPage = position;
        }
    }
Yashwanth Kumar
la source
Merci beaucoup mec .. ça marche .. Avez-vous déjà travaillé sur ViewPager?
sam_k
@Necronet non, ça ne devrait pas. La classe PageListener doit être une classe interne et non une classe imbriquée.
dcow
J'ai parfois une exception de pointeur nul au début des images du pager, pour des solutions plus fiables, je suggère cela, cela fonctionne bien pour moi. stackoverflow.com/a/13831450/2296787
MBH
setOnPageChangeListener()est obsolète, utilisez à la addOnPageChangeListener()place.
ZzZombo
47

Il existe une méthode object_of_ViewPager.getCurrentItem()qui renvoie la position de la page actuellement consultée du pager de vue

Krishna Shrestha
la source
J'ai en fait posté cette réponse en premier @ChuckBoris, mais celle-ci semble avoir recueilli plus de votes et apparemment une approbation. Les voies de ce site sont étranges :)
devanshu_kaushik
17

Si vous voulez seulement la position, vous la vp.getCurrentItem()donnera, pas besoin d'appliquer le onPageChangeListener () à cette seule fin.

devanshu_kaushik
la source
8

Vous comprendrez que setOnPageChangeListener est obsolète, utilisez addOnPageChangeListener, comme ci-dessous:

ViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
       if(position == 1){  // if you want the second page, for example
           //Your code here
       }
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});
Geraldo Neto
la source
7

Pour ce problème, Onpagechange listener est le meilleur Mais il aura aussi une petite erreur c'est qu'il ne détectera pas l'heure de début de la position 0.Une fois que vous changerez la page, il commencera à détecter la position de la page sélectionnée ... Pour cela problème je trouve la solution la plus simple

1.Vous devez conserver la valeur de position sélectionnée, puis l'utiliser ....
2. Cas 1: Au début de la position est toujours zéro ....
Cas 2: Supposons que si vous définissez l'élément actuel, cela signifie valeur en position de maintien 3,
puis faites votre action avec l'utilisation de ce maintien dans votre activité ...

Public int maintain=0;
myViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i2) {
             //Toast.makeText(MyActivity.this, i+"  Is Selected  "+data.size(), Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onPageSelected( int i) {
          // here you will get the position of selected page
            maintain = i;


        }

        @Override
        public void onPageScrollStateChanged(int i) {

        }
    });


updateButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            Toast.makeText(MyActivity.this, i+"  Is Selected  "+data.size(), Toast.LENGTH_SHORT).show();
            data.set(maintain, "Replaced "+maintain);         
            myViewPager.getAdapter().notifyDataSetChanged();
        }
    });
Naveen Kumar
la source
1
setOnPageChangeListener est obsolète. Utilisez addOnPageChangeListener au lieu de setOnPageChangeListener.
Selin le
6

getCurrentItem(), ne donne pas réellement la bonne position pour la première et la dernière page que je l'ai corrigée en ajoutant ce code:

public void CalcPostion() {    
    current = viewPager.getCurrentItem();

    if ((last == current) && (current != 1) && (current != 0)) {
        current = current + 1;
        viewPager.setCurrentItem(current);
    }
    if ((last == 1) && (current == 1)) {
        last = 0;
        current = 0;
    }
    display();
    last = current;
}
Da-moine
la source
5

Il n'y a aucune méthode getCurrentItem () dans viewpager.i qui a déjà vérifié l'API

raman
la source
3
Vous devez mettre à jour le package de compatibilité dans Android SDK Manager, puis seulement vous obtenez cette méthode.
krisDrOid
5

La méthode setOnPageChangeListener () est obsolète. Utilisez plutôt addOnPageChangeListener (OnPageChangeListener) .

Vous pouvez utiliser OnPageChangeListener et obtenir la position à l'intérieur de la onPageSelected()méthode, voici un exemple:

   viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            Log.d(TAG, "my position is : " + position); 
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

Ou utilisez simplement getCurrentItem () pour obtenir la position réelle:

viewPager.getCurrentItem();
Jorgesys
la source