Ho un ViewPager
(si estende FragmentPagerAdapter
) che contiene due Fragments
. Quello di cui ho bisogno è di aggiornare un ListView
per ogni Fragment
quando faccio scorrere tra di loro. Per questo ho implementato l'interfaccia ViewPager.OnPageChangeListener
(ovvero onPageScrollStateChanged
). Per conservare i riferimenti a Fragment
s uso un HashTable
. I memorizzare i riferimenti a Fragments
in HashTable
in getItem()
metodo:FragmentPagerAdapter non ricrea frammenti sul cambio di orientamento?
@Override
public Fragment getItem(int num) {
if (num == 0) {
Fragment itemsListFragment = new ItemsListFragment();
mPageReferenceMap.put(num, itemsListFragment);
return itemsListFragment;
} else {
Fragment favsListFragment = new ItemsFavsListFragment();
mPageReferenceMap.put(num, favsListFragment);
return favsListFragment;
}
}
Così, quando ho scorrere da un Fragment
a un altro il onPageScrollStateChanged
innesca in cui uso il HashTable
di chiamare il metodo richiesto sia Fragments
(refresh):
public void refreshList() {
((ItemsListFragment) mPageReferenceMap.get(0)).refresh();
((ItemsFavsListFragment) mPageReferenceMap.get(1)).refresh();
}
Tutto va bene fino all'evento orientation change
. Dopo che il codice refresh()
metodo, che è:
public void refresh() {
mAdapter.changeCursor(mDbHelper.getAll());
getListView().setItemChecked(-1, true); // The last row from a exception trace finishes here (my class).
}
risultati in IllegalStateException
:
java.lang.IllegalStateException: Content view not yet created
at android.support.v4.app.ListFragment.ensureList(ListFragment.java:328)
at android.support.v4.app.ListFragment.getListView(ListFragment.java:222)
at ebeletskiy.gmail.com.passwords.ui.ItemsFavsListFragment.refresh(ItemsFavsListFragment.java:17)
Assumendo la vista Content
non viene creata infatti a impostare la variabile boolean
in onActivityCreated()
metodo per true
e usato if/else
condizione di chiamare getListView()
o meno, che ha mostrato la visualizzazione di attività e contenuto creata correttamente.
Quindi eseguivo il debug per vedere quando FragmentPagerAdapter
invoca getItem()
e succede che il metodo non viene chiamato dopo l'evento orientation change
. Quindi sembra che ViewPager
detenga i riferimenti al vecchio Fragments
. Questa è solo la mia ipotesi.
Quindi, c'è un modo per far rispettare il ViewPager
per chiamare di nuovo getItem()
, in modo che io possa utilizzare i riferimenti corretti allo Fragments
corrente? Potrebbe essere un'altra soluzione? Grazie mille.
Non uso 'setRetainInstance()'. Il problema è nell'eccezione che si apre dopo "cambio di orientamento". Suppongo che i vecchi Frammenti siano in uso, perché ho controllato la condizione che 'onActivityCreated() 'sia eseguito per entrambi. – Eugene
@siik: Quando chiamate questo metodo 'refresh()'? E quando tiri fuori i frammenti appena creati per popolare il tuo (ick) 'Hashtable'? – CommonsWare
Sto chiamando questo metodo 'refresh()' in 'onPageScrollStateChanged()' (che è l'implementazione dell'interfaccia 'ViewPager.OnPageChangeListener', cioè quando passo il dito su' Fragments'). E popolo 'HashTable' nel metodo di classe' getItem() 'che estende' FragmentPagerAdapter' – Eugene