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 4
co 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 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łu getChildAt
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.