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.

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

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


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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.