ViewPager obsługujący stare fragmenty podczas obracania ekranu
ja używamViewPager
iFragmentStatePagerAdapter
pokazać fragment. Początkowo dodaje się 2 fragmenty Fragment1, a Fragment2 i trzeci fragment Fragment3 dodaje się na 2 pozycji po otrzymaniu odpowiedzi z serwera. Po dodaniu wszystkich stron powinna to być sekwencja fragmentów w ViewPager -> Fragment1, Fragment3, Fragment2.
Problem pojawia się po dodaniu Fragmentu 1 i Fragmentu 3, a aplikacja wykonuje wywołanie serwera przed dodaniem 3. Fragmentu na 2. pozycji, jeśli wykonuję obrót ekranu wielokrotnie, a po dodaniu trzeciego fragmentu nadal pokazuje starą kopię Fragmentu 2, który początkowo był na 2. pozycji na 2. pozycja i 3 pozycja mają nową kopię Fragmentu2. Tak więc Fragment3 doest pojawia się w ViewPager. Sekwencja po dodaniu 3. Fragmentu -> Fragment1, stara kopia Fragmentu2, Nowy Fragment2.
Jestem nadrzędnyonSaveInstanceState
i wołaniesuper.onSaveInstanceState
w mojej działalności.
Próbowałem też wrócićPOSITION_NONE
zgetItemPosition
. Czytałem gdzieś, że ViewPager zapisuje kopie fragmentu. Również poprzez debugowanie sprawdziłem, że ViewPager zawiera 2 kopie Fragmentu2, gdy problem został odtworzonygetItem
zFragmentStatePagerAdapter
zwrócił różne fragmenty dla każdej pozycji, ale wciąż na 2. pozycji pokazywał stary fragment. Do celów testowych wgetItem
Wróciłem Fragment1 dla wszystkich pozycji, tak aby wszystkie 3 strony były takie same, ale nawet po tym na drugiej pozycji pokazywał starą kopię Fragmentu 2, gdy odtwarzałem problem z krokami wymienionymi powyżej.
Więc jak to zrobićViewPager
tak, aby nie zapisywał starych fragmentów. Jak odświeżyć ViewPager, aby nie zachowywał starej kopii z fragmentami. Myślę, że problem jest z onSaveInstanceState, ale potrzebuję go. Jak mogę wykluczyćViewPager
kiedy widoki są zapisywaneonSaveInstanceState
. próbowałemmViewPager.setSaveEnabled(false)
ale zajmuje zbyt dużo pamięci.
Odkryłem, że problem jestinstantiateItem
metoda adaptera nie wywołuje getItem, ponieważ zwracany jest stary fragment.
Poniżej znajduje się kod rozwiązania
Kod:
@Override
public Object instantiateItem(ViewGroup container, int position) {
Object obj = super.instantiateItem(container, position);
Fragment fragment = mFragments.get(position);
if((obj!=null && fragment!=null) && !(obj.getClass().getSimpleName().equals(fragment.clss.getSimpleName()))){
destroyItem(container, position, obj);
return super.instantiateItem(container, position);
}else{
return obj;
}
}