2012-11-26 12 views
7

Przede wszystkim używam FragmentStatePagerAdapter, aby nakarmić ViewPager z fragmentami do wyświetlenia.ViewPager nie zawsze odświeża się po wywołaniu setAdapter, FragmentStatePagerAdapter

Kiedy aplikacja jest w stanie z systemem (czyli po onResume()), nazywając setAdapter na ViewPager zawsze będzie działać i zrobić mój ViewPager odświeżenia, sposób w adapterze getItem(int position) nazywa.

Jednak po zmianie orientacji, jeśli zadzwonię do setAdapter w metodzie onCreate(Bundle savedInstance) mojej aktywności, metoda getItem(int position) nie zostanie wywołana, a stary fragment zostanie ponownie użyty.

Myślę, że może FragmentManager robi coś, czego nie rozumiem? Menedżer fragmentów jest jedyną rzeczą, która nie ulega zniszczeniu podczas zmiany orientacji.

Dzięki

+0

Problem polega na zapisaniu stanu. Mam ten sam problem, ale nie mam rozwiązania. Możesz spróbować: po ustawieniu adaptera połączenia adaptera.saveState, niż ustaw adapter i wywołaj restoreSavedState z zapisanym stanem. W moim przypadku to nie pomogło, ale może dla ciebie. Powód: w ViewPager setAdapter zapisał bieżący stan i ponownie go użył. (Myślę, że) – Informatic0re

+1

Znajdź właściwą odpowiedź tutaj: http://stackoverflow.com/questions/13910826/viewpager-fragmentstatepageradapter-orientation-change – Informatic0re

+0

Czy to powoduje wycieki pamięci? Wielu twierdzi, że tak. Jakieś inne rozwiązanie, jak radzić sobie z tym scenariuszem? – pradyumnad

Odpowiedz

21

To może być bo używasz getFragmentManager() do instancji FragmentStatePagerAdapter podczas używania zagnieżdżonych fragmentów.

Spróbuj użyć getChildFragmentManager() zamiast:

CustomFragmentPagerAdapter fragmentPagerAdapter = new CustomFragmentPagerAdapter(getChildFragmentManager()); 

Odpowiedź została znaleziona here.

+0

Pracowałem dla mnie ... – Ganesh

+0

To była bardzo pomocna informacja! –

+0

Dzięki, ocal moje czasy ..! –

1

Cóż, oto co odkryłem (bardzo dziwne).

Jeśli trzeba odświeżyć produktów w PagerAdapter będziesz na pewno nie robią tworzenie nowych wystąpień PageAdapter kiedy przechodzą ten sam FragmentManager i przekazywanie ich do setAdapter wezwanie ViewPager, np:

FragmentManager fm = getChildFragmentManager(); 
mViewPager.setAdapter(new MyPagerAdapter(fm)); 

lub

FragmentManager fm = getActivity().getSupportFragmentManager(); 
mViewPager.setAdapter(new MyPagerAdapter(fm)); 

Ale jeśli będziesz stale przełączać FragmentManager s kiedy jesteś ini tialising PagerAdapter to zadziała.

Z mojego punktu widzenia to straszne ... Jeśli ktoś ma pomysły jak odświeżyć przedmioty w ViewPager prawidłowo (a nie w tej brudnej drodze), dzielić się swoimi przemyśleniami z innymi :)

0

używam FragmentPagerAdapter i mViewPager.setAdapter() nie działa. Naprawię to w poniższym kroku:
(1) pobierz aktualną listę Fragmentów.

List<Fragment> fragmentList = getSupportFragmentManager().getFragments(); 
List<Fragment> fragmentListCopy = new ArrayList<Fragment>(fragmentList); 

(2) usunąć fragment mamually

//I have two fragment 
getSupportFragmentManager().beginTransaction().remove(fragmentList.get(0)).commit(); 
getSupportFragmentManager().beginTransaction().remove(fragmentList.get(1)).commit(); 

(3) ustawić nowy FragmentPagerAdapter do ViewPager

mViewPager.setAdapter(...) 

Wystarczy usunąć fragmenty przed ustawieniem nowej karty.

Powiązane problemy