Używam ViewPagera w mojej aplikacji i definiuję go w głównym działaniu. Wewnątrz onCreate
metody ładuję pewną liczbę stron z SharedPreferences i przekazuję to do PagerAdapter:
@Override
public int getCount() {
return numberOfPages;
}
Problem polega na tym, że gdybym zmienił tę liczbę w Preferencjach (lub innym działaniu) na inny indeks strony, który wcześniej przeglądałem, moja aplikacja ulega awarii, ponieważ ten indeks jest poza zakresem, kiedy wracam do działania z tym ViewPager. Można to naprawić po prostu zmieniając aktywną stronę ViewPager. Czy jest na to sposób?
źródło
0
wonPause
metodzie i nie ma awarii. Dzięki.przesuń w prawo
viewPager.arrowScroll (View.FOCUS_RIGHT);
przesuń w lewo
viewPager.arrowScroll (View.FOCUS_LEFT);
źródło
Bez sprawdzania kodu myślę, że opisujesz to, że Twoje strony nie są zsynchronizowane i masz nieaktualne dane.
Mówisz, że zmieniasz liczbę stron, a następnie ulega awarii, ponieważ uzyskujesz dostęp do starego zestawu stron. Wydaje mi się, że nie dzwonisz
pageAdapter.notifyDataSetChanged()
po zmianie danych.Kiedy
viewPager
pokazujesz stronę 3 z zestawu 10 stron i zmieniasz zestaw na tylko 5, a następnie zadzwońnotifyDataSetChanged()
, zobaczysz, że przeglądasz teraz stronę 3 nowego zestawu. Jeśli poprzednio przeglądałeś stronę 8 starego zestawu, po włożeniu nowego zestawu i wywołaniunotifyDataSetChanged()
zobaczysz, że teraz przeglądasz ostatnią stronę nowego zestawu bez awarii.Jeśli po prostu zmienisz bieżącą stronę, możesz po prostu maskować problem.
źródło
notifyDataSetChanged()
aby przejść na inną stronę, wypróbuj ten kod:
źródło
viewPager.setCurrentItem
Dodatkowa odpowiedź
Początkowo miałem problem z uzyskaniem odwołania do
ViewPager
metody innych klas, ponieważaddOnTabSelectedListener
utworzono anonimową klasę wewnętrzną, która z kolei wymagałaViewPager
zadeklarowania zmiennejfinal
. Rozwiązaniem było użycie zmiennej składowej klasy i nie używanie anonimowej klasy wewnętrznej.źródło