Comment afficher par programme la vue suivante dans ViewPager?

107

J'ai créé un ViewPager et tout fonctionne bien, mais je veux avoir un bouton suivant précédent en dehors de ViewPager qui peut être utilisé pour naviguer à l'intérieur de ViewPager. Comment puis-je aller à l'élément suivant sur ViewPager sans faire glisser manuellement?

Vaibhav Mishra
la source
39
Cela ne fonctionne-t-il pas viewpager.setCurrentItem (int index); ?
blessenm
il l'a fait, je suppose que cette question est un double.
Vaibhav Mishra
1
Copie
mmd1080

Réponses:

154

La réponse à la bénédiction viewpager.setCurrentItem(int index)est la voie à suivre.

Vaibhav Mishra
la source
5
Malheureusement, j'obtiens un comportement différent, lorsque l'utilisateur glisse manuellement et lorsque je saute en utilisant setCurrentItem. L'ordre des appels est inversé. Lorsque je glisse, il appelle d'abord OnPageChangeListener # onPageSelected, puis il appelle setUserVisibleHint dans les fragments. Si j'utilise setCurrentItem, il appelle d'abord setUserVisibleHint dans les fragments, puis il appelle OnPageChangeListener # onPageSelected, ce qui est vraiment un problème dans mon cas: / donc j'espérais trouver un moyen de conserver le comportement naturel tout en continuant à passer par programme à une autre page .
AgentKnopf
@Vaibhav et si je veux montrer la prochaine vue de l'activité
Prabs
@AgentKnopf Avez-vous réussi à trouver une solution à ce problème? Je vois aussi ce comportement étrange mais je ne trouve pas de moyen de garder le flux du balayage régulier lorsque je passe par programme au fragment suivant / précédent.
Gil
@Gil J'ai peur que non - j'ai supprimé le changement programmatique de la vue actuelle et j'ai simplement autorisé le balayage. Cependant, nous avons complètement changé l'implémentation plus tard, donc je n'ai pas approfondi cette question.
AgentKnopf
107

Une implémentation complète juste pour l'exhaustivité:

public void MoveNext(View view) {
    //it doesn't matter if you're already in the last item
    pager.setCurrentItem(pager.getCurrentItem() + 1);
}

public void MovePrevious(View view) {
    //it doesn't matter if you're already in the first item
    pager.setCurrentItem(pager.getCurrentItem() - 1);
}
Androiderson
la source
Vous pourriez en avoir besoin. Par exemple, si le changement est déclenché par un clic, vous pouvez utiliser (nextBt.getId() == view.id)pour savoir ce qui l'a causé
Tomas Wolf
2
@Sagar, il a peut-être défini l'écouteur de clic du bouton en XML, dans ce cas, vous devez avoir le paramètre view, même si vous n'en avez pas besoin.
Ashish Tanna
L'animation de balayage de page ne vient pas?
Lavekush Agrawal
18

Le moyen le plus simple est:

nextButton.setOnClickListener { pager.arrowScroll(View.FOCUS_RIGHT) }
prevButton.setOnClickListener { pager.arrowScroll(View.FOCUS_LEFT) }
Pitel
la source
Notez que cela ne fonctionne pas avec ViewPager2.
Micer
0

Je répare mieux, ty Androiderson.

  private void MoveNextTopSlideShow(View view)
    {
        if (_viewPager_TopImageSlide.CurrentItem == _viewPager_TopImageSlide.ChildCount)
        {
            if (_viewPager_TopImageSlide.ChildCount > 0)
            {
                _viewPager_TopImageSlide.SetCurrentItem(0,true);
            }
        }
        else
        {
            //it doesn't matter if you're already in the last item
            _viewPager_TopImageSlide.SetCurrentItem(_viewPager_TopImageSlide.CurrentItem + 1, true);
        }
    }

    private void MovePreviousTopSlideShow(View view)
    {
        if (_viewPager_TopImageSlide.CurrentItem == 0)
        {
            if (_viewPager_TopImageSlide.ChildCount > 0)
            {
                _viewPager_TopImageSlide.SetCurrentItem(_viewPager_TopImageSlide.ChildCount-1, true);
            }
        }
        else
        {
            //it doesn't matter if you're already in the first item
            _viewPager_TopImageSlide.SetCurrentItem(_viewPager_TopImageSlide.CurrentItem - 1, true);
        }
    }
Arman
la source