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.
Możesz użyć:
mViewPager.getCurrentItem()
źródło
Zaktualizuj 2019
Teraz możesz ustawić
addOnPageChangeListener
na 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) } })
źródło
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 ztoString()
(lubgetLeft()
) 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 4
co oznacza, żeViewPager.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 1
co 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ługetChildAt
jest 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
onClickListenter
lub 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.źródło