¿Cómo mostrar la siguiente vista mediante programación en ViewPager?

107

Creé un ViewPager y todo funciona bien, sin embargo, quiero tener un botón siguiente anterior fuera de ViewPager que se puede usar para navegar dentro de ViewPager. ¿Cómo puedo ir al siguiente elemento en ViewPager sin deslizar el dedo manualmente?

Vaibhav Mishra
fuente
39
¿No funciona esto viewpager.setCurrentItem (int index); ?
blessenm
lo hizo, supongo que esta pregunta es un duplicado.
Vaibhav Mishra
1
Posible duplicado de ¿Cómo cambiar la página de ViewPager?
mmd1080

Respuestas:

154

Como respondió blessenm, viewpager.setCurrentItem(int index)es el camino a seguir.

Vaibhav Mishra
fuente
5
Desafortunadamente, obtengo un comportamiento diferente cuando el usuario desliza el dedo manualmente y cuando salto usando setCurrentItem. El orden de las llamadas se invierte. Cuando deslizo el dedo, primero llama a OnPageChangeListener # onPageSelected y luego llama a setUserVisibleHint en los fragmentos. Si uso setCurrentItem, primero llama a setUserVisibleHint en los fragmentos y luego llama a OnPageChangeListener # onPageSelected, que realmente es un problema en mi caso: / así que esperaba encontrar una manera de mantener el comportamiento natural pero aún así pasar programáticamente a otra página .
AgentKnopf
@Vaibhav, ¿y si quiero mostrar la próxima vista de actividad
Prabs
@AgentKnopf ¿Se las arregló para encontrar una solución para este problema? También veo este comportamiento extraño, pero no puedo encontrar una manera de mantener el flujo del deslizamiento regular cuando cambio programáticamente al fragmento siguiente / anterior.
Gil
@Gil Me temo que no: eliminé el cambio programático de la vista actual y solo permití deslizar. Sin embargo, cambiamos completamente la implementación más tarde, así que no continué con este problema.
AgentKnopf
107

Una implementación completa solo para completar:

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
fuente
Puede que lo necesite. Por ejemplo, si el cambio es provocado por un clic, podría usar (nextBt.getId() == view.id)para saber qué lo causó
Tomas Wolf
2
@Sagar es posible que haya configurado el oyente de clic del botón en xml, en ese caso debe tener el parámetro de vista, incluso si no lo necesita.
Ashish Tanna
¿No aparece la animación de deslizamiento de página?
Lavekush Agrawal
18

La forma más sencilla es:

nextButton.setOnClickListener { pager.arrowScroll(View.FOCUS_RIGHT) }
prevButton.setOnClickListener { pager.arrowScroll(View.FOCUS_LEFT) }
Pitel
fuente
Tenga en cuenta que esto no funciona con ViewPager2.
Micer
0

Lo arreglo mejor, 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
fuente