Tengo un ViewPager
(extiende FragmentPagerAdapter
) que tiene dos Fragments
. Lo que necesito es actualizar un ListView
para cada Fragment
cuando deslizo entre ellos. Para esto he implementado la interfaz ViewPager.OnPageChangeListener
(es decir, onPageScrollStateChanged
). Para mantener referencias a Fragment
s utilizo un HashTable
. Almaceno referencias a Fragments
en HashTable
en getItem()
método:FragmentPagerAdapter no recrea Fragmentos en el cambio de orientación?
@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;
}
}
Así que cuando desliza el dedo de uno Fragment
a otro del onPageScrollStateChanged
desencadena cuando utilizo el HashTable
llamar al método requerido tanto en Fragments
(actualización):
public void refreshList() {
((ItemsListFragment) mPageReferenceMap.get(0)).refresh();
((ItemsFavsListFragment) mPageReferenceMap.get(1)).refresh();
}
Todo va bien hasta que ocurra el evento orientation change
. Después de que el código en refresh()
método, que es:
public void refresh() {
mAdapter.changeCursor(mDbHelper.getAll());
getListView().setItemChecked(-1, true); // The last row from a exception trace finishes here (my class).
}
resultados en 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)
Suponiendo que la vista Content
no se crea de hecho I establecer la variable de boolean
en onActivityCreated()
método para true
y solía if/else
condición para llamar al getListView()
o no, que muestra la actividad y la vista de contenido creada con éxito.
Luego estaba depurando para ver cuando FragmentPagerAdapter
invoca getItem()
y sucede que el método no se llama después del evento orientation change
. Parece que ViewPager
contiene referencias al antiguo Fragments
. Esta es solo mi suposición.
Así que, ¿hay alguna manera de hacer cumplir la ViewPager
para llamar getItem()
de nuevo, por lo que puede utilizar referencias adecuadas a la corriente Fragments
? Puede ser alguna otra solución? Muchas gracias.
No uso 'setRetainInstance()' allí. El problema está en la excepción que aparece después del 'cambio de orientación'. Solo asumo que los Fragmentos viejos están en uso, porque verifiqué la condición de 'onActivityCreated()' para ambos. – Eugene
@siik: ¿Cuándo llamas a este método 'refresh()'? ¿Y cuándo sacas los fragmentos recién creados para poblar tu (ick) 'Hashtable'? – CommonsWare
Llamo a este método 'refresh()' en 'onPageScrollStateChanged()' (que es la implementación de la interfaz 'ViewPager.OnPageChangeListener', es decir, cuando deslizo entre' Fragments'). Y llené 'HashTable' en' getItem() 'método de clase que se extiende' FragmentPagerAdapter' – Eugene