87 votes

Obtenir la position actuelle d'un ViewPager

Je sais qu'avec le widget Gallery j'ai pu utiliser getSelectedItemPosition() ; pour récupérer la position actuelle, mais il ne semble pas que ViewPager ait cette possibilité.

Je sais que je peux configurer un écouteur et récupérer la position lorsque la page est changée. Mais je veux la position actuelle de la vue.

203voto

Terry Points 1398

Vous pouvez utiliser :

mViewPager.getCurrentItem()

0 votes

Il n'y a pas de méthode getCurrentItem dans ViewPager.

20 votes

Si, il y en a un : [developer.Android.com/reference/Android/support/v4/view/](http://developer.android.com/reference/android/support/v4/view/ViewPager.html#getCurrentItem())

3 votes

Désolé, j'avais tort. Je viens de mettre à jour ma bibliothèque de support et cette méthode existe dans la nouvelle version.

94voto

Marcel Căşvan Points 1669

Créez un écouteur et placez-le sur votre viewpager :

/**
 * Get the current view position from the ViewPager by
 * extending SimpleOnPageChangeListener class and adding your method
 */
public class DetailOnPageChangeListener extends ViewPager.SimpleOnPageChangeListener {

    private int currentPage;

    @Override
    public void onPageSelected(int position) {
        currentPage = position;
    }

    public final int getCurrentPage() {
        return currentPage;
    }
}

4 votes

Soyez juste conscient lorsque vous l'utilisez : getCurrentPage() retournera toujours 0 si la vue n'a jamais été modifiée. Pour une raison quelconque, si vous entrez dans le ViewPager sur une vue autre que la première vue, la valeur attendue ne devrait pas être 0... Je viens de rencontrer un problème avec cela car je n'ai pas toujours entré la vue sur la première vue.

1 votes

@Adam pouvez-vous s'il vous plaît me dire comment appeler cette fonction getCurrentPage

0 votes

C'est très simple. Merci androidu.

7voto

Hitesh Sahu Points 12561

Mise à jour 2019

Vous pouvez maintenant définir addOnPageChangeListener sur View Pager pour observer le changement de position de la page.

Puisque vous vouliez configurer un écouteur et récupérer la position quand la page est changée

mViewPager.addOnPageChangeListener(object : OnPageChangeListener {
            override fun onPageScrollStateChanged(state: Int) {}
            override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}

            override fun onPageSelected(position: Int) {
                pagePosition.setText("" + position + "/" + galleryAdapter!!.count)
            }
        })

1voto

Ma solution ne fonctionnerait que si vous avez un TabLayout lié à votre ViewPager.

C'est comme ça qu'ils sont liés :

tabLayout.setupWithViewPager(viewPager);

Et ensuite, pour obtenir la position actuelle, vous pouvez utiliser :

tabLayout.getSelectedTabPosition()

0voto

Pimp Trizkit Points 1357

Je vous le dis maintenant, c'est un hack, donc il n'y a aucune raison de décoter pour cette raison. En d'autres termes, soit il vous sera utile, soit il ne le sera pas. Dans tous les cas, la description ci-dessous fournira un aperçu et sera utile à la communauté. En outre, cette solution est bonne pour les anciennes API qui n'ont pas de fonction ViewPager.getCurrentItem() .


Tout d'abord, une petite information. Si vous parcourez tous les enfants d'un ViewPager à l'aide de la fonction ViewPager.getChildAt(x); et l'imprimer avec toString() (ou getLeft() ) chaque vue enfant (une page) et faire cela chaque fois que vous changez de page, vous remarquerez que les enfants ne seront pas dans l'ordre logique dans lequel ils sont affichés lorsque vous commencez à remonter les pages (pagination vers le début). Apparemment, le système supprime l'enfant inutile du tableau, puis ajoute l'enfant le plus récent au tableau. Ainsi, par exemple, si vous regardez la page 2 puis passez à la page 3, votre liste d'enfants sera dans l'ordre suivant page 2, page 3, page 4 ce qui signifie que ViewPager.getChildAt(1); retournera la page actuelle. Mais, si vous revenez ensuite à la page 2 (à partir de la page 3), votre liste d'enfants sera dans cet ordre page 2, page 3, page 1 ce qui signifie que ViewPager.getChildAt(1); ne renvoie pas la page actuelle. Je n'ai pas encore réussi à trouver une logique simple permettant d'extraire la page actuelle à l'aide de cette information. Parce que l'ordre des pages dans le tableau derrière getChildAt est dans un ordre arbitraire basé sur la façon dont l'utilisateur a paginé.

Ceci étant dit, j'ai développé une solution de contournement. Je n'ai aucune idée si cette fonction fonctionnera dans tous les environnements, mais elle fonctionne pour mon projet actuel. Je soupçonne que si ce n'est pas le cas pour vous, c'est un problème de niveau d'API différent. Mais je ne soupçonne pas de problèmes pour d'autres environnements.

Maintenant, la viande. Ce que j'ai remarqué, c'est que le résultat ViewPager.getChildAt(x).getLeft() aura un certain type de coordonnées horizontales en pixels par rapport au parent. J'ai donc utilisé cette information pour déterminer quelle vue est la vue actuelle.

private int getCurrentPageIndex(ViewPager vp){
    int first,second,id1,id2,left;
    id1 = first = second = 99999999;
    View v;
    for ( int i = 0, k = vp.getChildCount() ; i < k ; ++i ) {
        left = vp.getChildAt(i).getLeft();
        if ( left < second ) {
            if ( left < first ) {
                second = first;
                id2 = id1;
                first = left;
                id1 = i;
            } else {
                second = left;
                id2 = i;
            }
        }
    }
    return id2;
}

Cette fonction est probablement un hack discutable car elle repose sur la valeur de getLeft() pour comprendre tout ça. Mais, je prends la coordonnée gauche de chaque enfant. Je la compare ensuite aux autres valeurs et je stocke la première et la deuxième page, renvoyant la deuxième page (page actuelle) hors de la fonction. Cela semble fonctionner à merveille.

Pourquoi (me demanderez-vous) n'ai-je pas simplement utilisé onClickListenter ou toute autre solution ? Eh bien, j'étais bien décidé à trouver un moyen direct de le faire sans avoir à inclure des écouteurs, d'autres classes, une mise au point peu concluante et d'autres éléments inutiles. Malheureusement, cette solution n'est pas vraiment directe. Mais elle permet de se débarrasser des éléments superflus, des autres classes et des listeners. Si je peux trouver un moyen plus direct, je réécrirai cette fonction. Ou peut-être, cela fournira un aperçu pour quelqu'un d'autre d'avoir une épiphanie.

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