Jak uzyskać aktualny numer strony ViewPagera na Androida?

84

Chcę poznać bieżącą pozycję na stronie ViewPager. Tworzę adapter i ustawiam ten adapter na ViewPager. Teraz chcę poznać bieżący numer strony lub pozycję bieżącego widoku, ponieważ chcę rozpocząć dodatkowe zdarzenia na tej konkretnej stronie.

Użyłem viewPager.setCurrentItem(1);do ustawienia pierwszej pozycji.

Czy istnieje podobny sposób uzyskiwania bieżącej strony?

sam_k
źródło

Odpowiedzi:

180

w najnowszych pakietach możesz również użyć

vp.getCurrentItem()

lub

vp to viewPager,

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

musisz umieścić odbiornik zmian strony dla twojego viewPager. W viewPager nie ma metody pobierania bieżącej strony.

private int currentPage;

    private static class PageListener extends SimpleOnPageChangeListener{
            public void onPageSelected(int position) {
                Log.i(TAG, "page selected " + position);
                   currentPage = position;
        }
    }
Yashwanth Kumar
źródło
Wielkie dzięki stary… to działa… Czy pracowałeś wcześniej nad ViewPager?
sam_k
@Necronet nie, nie powinno. Klasa PageListener powinna być klasą wewnętrzną, a nie klasą zagnieżdżoną.
dcow
Czasami na początku obrazów pagera dostałem wyjątek zerowego wskaźnika, dla bardziej niezawodnych rozwiązań sugeruję to, działa dobrze dla mnie. stackoverflow.com/a/13831450/2296787
MBH
setOnPageChangeListener()jest przestarzały, użyj addOnPageChangeListener()zamiast niego.
ZzZombo,
47

Istnieje metoda, object_of_ViewPager.getCurrentItem()która zwraca pozycję aktualnie oglądanej strony dla pagera widoku

Krishna Shrestha
źródło
Właściwie najpierw opublikowałem tę odpowiedź na @ChuckBoris, wciąż wydaje się, że ta zebrała więcej głosów i najwyraźniej poparcie. Dziwne są sposoby tej strony :)
devanshu_kaushik 16.04.2016
17

Jeśli chcesz tylko pozycję, vp.getCurrentItem()da ci ją, nie musisz stosować onPageChangeListener () tylko do tego celu.

devanshu_kaushik
źródło
8

Dowiesz się, że setOnPageChangeListener jest przestarzały, użyj addOnPageChangeListener, jak poniżej:

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
źródło
7

W przypadku tego problemu odbiornik Onpagechange jest najlepszy Ale będzie miał również jeden mały błąd, że nie wykryje czasu rozpoczęcia dla pozycji zerowej Po zmianie strony zacznie wykrywać wybraną pozycję strony ... W tym celu problem znajduję najłatwiejsze rozwiązanie

1. Musisz zachować wybraną wartość pozycji, a następnie jej użyć ....
2. Przypadek 1: Na początku pozycji jest zawsze zero ....
Przypadek 2: Załóżmy, że jeśli ustawisz bieżącą pozycję, to ustawisz ją wartości do utrzymania pozycji 3, a
następnie wykonaj swoje działanie, wykorzystując to w swojej działalności ...

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
źródło
1
setOnPageChangeListener jest przestarzałe. Użyj addOnPageChangeListener zamiast setOnPageChangeListener.
Selin
6

getCurrentItem(), właściwie nie podaje właściwej pozycji dla pierwszej i ostatniej strony Poprawiłem to dodając ten kod:

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-mnich
źródło
5

Nie ma żadnej metody getCurrentItem () w viewpager.i sprawdzonej już API

raman
źródło
3
Musisz zaktualizować pakiet zgodności w Android SDK Manager, a następnie uzyskasz tylko tę metodę.
krisDrOid
5

Metoda setOnPageChangeListener () jest przestarzała. Zamiast tego użyj addOnPageChangeListener (OnPageChangeListener) .

Możesz użyć OnPageChangeListener i uzyskać pozycję wewnątrz onPageSelected()metody, oto przykład:

   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) {

        }
    });

Lub po prostu użyj getCurrentItem (), aby uzyskać rzeczywistą pozycję:

viewPager.getCurrentItem();
Jorgesys
źródło