2012-11-26 7 views
7

Prima di tutto, sto utilizzando FragmentStatePagerAdapter per alimentare un ViewPager con frammenti da visualizzare.ViewPager non si aggiorna sempre quando viene chiamato setAdapter, FragmentStatePagerAdapter

Quando l'app è in esecuzione (ad esempio dopo onResume()), la chiamata di setAdapter sul ViewPager funziona sempre e il mio ViewPager si aggiorna, viene chiamato il metodo getItem(int position) nell'adattatore.

Tuttavia, dopo un cambio di orientamento, se si chiama setAdapter nel metodo onCreate(Bundle savedInstance) della mia attività, il metodo getItem(int position) non viene chiamato e il vecchio frammento viene riutilizzato.

Sto pensando che FragmentManager stia facendo qualcosa che non capisco? Fragment Manager è l'unica cosa che non viene distrutta durante il cambio di orientamento.

Grazie

+0

Il problema è SavedState. Ho lo stesso problema ma nessuna soluzione. Puoi provare a seguire: prima di impostare l'adattatore di chiamata dell'adattatore.saveState, quindi imposta l'adattatore e chiama restoreSavedState con lo stato salvato. Nel mio caso non ha aiutato, ma forse per te. Motivo: nel ViewPager setAdapter è stato salvato lo stato corrente e riutilizzato. (penso) – Informatic0re

+1

Trova la risposta giusta qui: http://stackoverflow.com/questions/13910826/viewpager-fragmentstatepageradapter-orientation-change – Informatic0re

+0

Ciò causa perdite di memoria? Molti dicono di sì. Qualche altra soluzione su come gestire questo scenario? – pradyumnad

risposta

21

Potrebbe essere perché si sta utilizzando getFragmentManager() per istanziare il FragmentStatePagerAdapter durante l'utilizzo di frammenti nidificate.

Provare a utilizzare getChildFragmentManager() invece:

CustomFragmentPagerAdapter fragmentPagerAdapter = new CustomFragmentPagerAdapter(getChildFragmentManager()); 

risposta è stata trovata here.

+0

Ha funzionato per me .... – Ganesh

+0

Questa è stata un'informazione molto utile! –

+0

Grazie salva i miei tempi ..! –

1

Bene ecco la cosa che ho scoperto (è molto molto strano).

Se è necessario aggiornare articoli in PagerAdapter vi troverete sicuramente riuscire a fare in modo di creare nuove istanze di PageAdapter quando fate passare lo stesso FragmentManager e di passarli alla setAdapter chiamata del ViewPager, ad esempio:

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

o

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

Ma se si passa costantemente FragmentManager s quando sei ini tialising PagerAdapter allora funzionerà.

Dal mio punto di vista è orribile ... Se qualcuno ha idee su come aggiornare gli elementi in ViewPager correttamente (e non in questo modo sporco), condividere i tuoi pensieri con gli altri :)

0

Io uso il FragmentPagerAdapter e mViewPager.setAdapter() non funziona. Lo risolvo nel seguente passaggio:
(1) ottieni l'attuale elenco dei frammenti.

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

(2) rimuovere frammento mamually

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

(3) impostato nuova FragmentPagerAdapter a ViewPager

mViewPager.setAdapter(...) 

Basta togliere i frammenti prima di impostare nuovo adattatore.