Pobieranie aktualnej pozycji ViewPagera

84

Wiem, że dzięki widżetowi Galeria udało mi się użyć metody getSelectedItemPosition (); aby pobrać aktualną pozycję, jednak nie wydaje się, że ViewPager ma to.

Wiem, że mogę skonfigurować odbiornik i pobrać pozycję, gdy strona jest przełączana. Ale chcę aktualną pozycję widoku.

Adam
źródło

Odpowiedzi:

94

Utwórz odbiornik i ustaw go na swoim 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;
    }
}
androidu
źródło
4
Po prostu bądź świadomy, gdy używasz tego: getCurrentPage () zawsze zwróci 0, gdy widok nigdy nie został zmieniony. Z jakiegoś powodu, jeśli wejdziesz do ViewPager w innym widoku niż pierwszy widok, oczekiwana wartość nie powinna wynosić 0 ... Po prostu napotkałem problem z tym, ponieważ nie zawsze wprowadzałem widok na pierwszym widok.
Brandon Romano
1
@Adam, czy możesz mi powiedzieć, jak wywołać tę funkcję getCurrentPage
user3233280
To jest bardzo proste. Dziękuję androidu.
whdals0
193

Możesz użyć:

mViewPager.getCurrentItem()
Terry
źródło
Istnieje metoda nie getCurrentItem w ViewPager
Dmitry Guselnikov
3
Przepraszam pomyliłam się. Właśnie zaktualizowałem moją bibliotekę wsparcia i ta metoda istnieje w nowej wersji
Dmitry Guselnikov
4

Zaktualizuj 2019

Teraz możesz ustawić addOnPageChangeListenerna View Pager, aby obserwować zmianę pozycji strony.

Ponieważ chciałeś ustawić słuchacza i pobrać pozycję, gdy strona jest przełączana

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)
            }
        })
Hitesh Sahu
źródło
0

Mówię ci teraz, że to hack, więc nie ma powodu, aby głosować przeciw z tego powodu. Oznacza to, że albo będzie ci specjalnie pomocne, albo nie. Tak czy inaczej, poniższy opis zapewni pewien wgląd i będzie pomocny dla społeczności. To rozwiązanie jest również dobre dla starszych interfejsów API, które nie mają ViewPager.getCurrentItem().


Najpierw trochę informacji. Jeśli przejdziesz przez wszystkie elementy podrzędne ViewPager ViewPager.getChildAt(x);i wydrukujesz je z toString()(lub getLeft()) każdym podrzędnym Widokiem (stroną), a następnie zrobisz to za każdym razem, gdy zmieniasz strony, zauważysz, że elementy podrzędne nie będą w logicznej kolejności, w jakiej są wyświetlane kiedy zaczynasz wracać do poprzedniej strony (powrót do początku). Najwyraźniej usunie niepotrzebne dziecko z tablicy, a następnie dołączy najnowsze dziecko do tablicy. Na przykład, powiedzmy, że przeglądasz stronę 2, a następnie zmieniono ją na stronę 3, twoja lista dzieci będzie w tej kolejności, page 2, page 3, page 4co oznacza, że ViewPager.getChildAt(1);zwrócą bieżącą stronę. Ale jeśli następnie wrócisz do strony 2 (ze strony 3), twoja lista dzieci będzie w tej kolejności, page 2, page 3, page 1co oznacza, żeViewPager.getChildAt(1);nie zwraca bieżącej strony. Nie udało mi się jeszcze znaleźć prostej logiki, aby usunąć bieżącą stronę przy użyciu tych informacji. Ponieważ kolejność stron w tablicy z tyłu getChildAtjest w dowolnej kolejności w zależności od tego, jak użytkownik przeglądał strony.

Mając to na uwadze, opracowałem sposób obejścia tego problemu. Nie mam pojęcia, czy ta funkcja będzie działać we wszystkich środowiskach, ale działa w moim obecnym projekcie. Podejrzewam, że jeśli nie, to jest to problem z innym poziomem API. Ale tak naprawdę nie podejrzewam żadnych problemów w innych środowiskach.

Teraz przejdźmy do mięsa. Zauważyłem, że wynik ViewPager.getChildAt(x).getLeft()będzie miał pewien rodzaj poziomej współrzędnej piksela w stosunku do rodzica. Więc użyłem tych informacji, aby odfiltrować bieżący widok.

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;
}

Ta funkcja jest prawdopodobnie wątpliwym hackerem, ponieważ opiera się na wartości, getLeft()aby to wszystko rozgryźć. Ale chwytam lewą współrzędną każdego dziecka. Następnie porównuję to z innymi wartościami i przechowuję pierwszą i drugą stronę, zwracając drugą stronę (bieżącą stronę) z funkcji. Wydaje się, że działa pięknie.

Dlaczego (możesz zapytać) nie użyłem po prostu onClickListenterlub jakiegokolwiek rozwiązania? Cóż, byłem cholernie zdeterminowany, aby to zrobić w prosty sposób, bez konieczności angażowania słuchaczy, innych zajęć, niejednoznacznego skupienia się i innych wzdęć. Niestety to rozwiązanie nie jest do końca proste. Ale eliminuje wzdęcia, inne zajęcia i słuchaczy. Jeśli uda mi się znaleźć prostszy sposób, przepiszę tę funkcję. A może zapewni to komuś innemu wgląd do objawienia.

Pimp Trizkit
źródło
1
uratowałeś mnie! miał jakiś ohydny błąd. nie mógł znaleźć, co się dzieje. Pan, Panie, zasługuje na biliard pozytywnych głosów!
Nursultan Talapbekov
Dziękuję panom! Myślę, że społeczność nie podziela Twojego entuzjazmu.
Pimp Trizkit