Jak programowo wyświetlić następny widok w ViewPager?

107

Utworzyłem ViewPager i wszystko działa dobrze, jednak chcę mieć poprzedni następny przycisk poza ViewPager, który może być używany do nawigacji wewnątrz ViewPager. Jak mogę przejść do następnego elementu w ViewPager bez ręcznego przesuwania?

Vaibhav Mishra
źródło
39
Czy to nie działa viewpager.setCurrentItem (int index); ?
blessenm
tak, przypuszczam, że to pytanie jest duplikatem.
Vaibhav Mishra
1
Możliwy duplikat Jak zmienić stronę ViewPagera?
mmd1080

Odpowiedzi:

154

Jak odpowiedział Blessenm, viewpager.setCurrentItem(int index)jest droga do zrobienia.

Vaibhav Mishra
źródło
5
Niestety, mam inne zachowanie, gdy użytkownik przesuwa palcem ręcznie i kiedy skaczę za pomocą setCurrentItem. Kolejność wywołań jest odwrócona. Kiedy przesuwam, najpierw wywołuje OnPageChangeListener # onPageSelected, a następnie wywołuje we fragmentach setUserVisibleHint. Jeśli używam setCurrentItem, najpierw wywołuje on we fragmentach setUserVisibleHint, a następnie wywołuje OnPageChangeListener # onPageSelected, co w moim przypadku jest naprawdę problemem: / więc miałem nadzieję, że znajdę sposób na zachowanie naturalnego zachowania, ale nadal programowo przechodzę na inną stronę .
AgentKnopf
@Vaibhav co jeśli chcę pokazać następny widok aktywności
Prabs
@AgentKnopf Czy udało Ci się znaleźć rozwiązanie tego problemu? Widzę również to dziwne zachowanie, ale nie mogę znaleźć sposobu na utrzymanie przepływu zwykłego przesunięcia, gdy programowo przełączam się do następnego / poprzedniego fragmentu.
Gil
@Gil Obawiam się, że nie - usunąłem programową zmianę bieżącego widoku i po prostu pozwoliłem sobie na przesuwanie. Jednak później całkowicie zmieniliśmy implementację, więc nie zajmowałem się dalej tym problemem.
AgentKnopf,
107

Kompletna implementacja tylko dla kompletności:

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
źródło
Możesz tego potrzebować. Na przykład, jeśli zmiana jest wywoływana przez kliknięcie, możesz użyć, (nextBt.getId() == view.id)aby dowiedzieć się, co ją spowodowało
Tomas Wolf
2
@Sagar mógł ustawić nasłuchiwanie kliknięć przycisku w xml, w takim przypadku musisz mieć parametr widoku, nawet jeśli go nie potrzebujesz.
Ashish Tanna
nie pojawia się animacja przesuwania strony?
Lavekush Agrawal
18

Najłatwiej jest:

nextButton.setOnClickListener { pager.arrowScroll(View.FOCUS_RIGHT) }
prevButton.setOnClickListener { pager.arrowScroll(View.FOCUS_LEFT) }
Pitel
źródło
Zauważ, że to nie działa z ViewPager2.
Micer
0

Naprawię to Lepiej, 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
źródło