Mam ViewPager
(rozszerza FragmentPagerAdapter
), który przechowuje dwa Fragments
. To, czego potrzebuję, to odświeżenie ListView
dla każdego Fragment
podczas przesuwania między nimi. W tym celu zaimplementowałem interfejs ViewPager.OnPageChangeListener
(a mianowicie onPageScrollStateChanged
). W celu przechowywania odniesień do Fragment
s używam HashTable
. Przechowywać odnośniki do Fragments
w HashTable
w getItem()
metody:FragmentPagerAdapter nie odtwarza fragmentów po zmianie orientacji?
@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;
}
}
Więc kiedy trzepnąć z jednego Fragment
drugiemu onPageScrollStateChanged
wyzwala gdzie używam HashTable
zadzwonić wymaganej metody zarówno Fragments
(Odśwież):
public void refreshList() {
((ItemsListFragment) mPageReferenceMap.get(0)).refresh();
((ItemsFavsListFragment) mPageReferenceMap.get(1)).refresh();
}
Wszystko idzie dobrze, aż dojdzie do zdarzenia orientation change
. Po to kod w refresh()
metody, która jest:
public void refresh() {
mAdapter.changeCursor(mDbHelper.getAll());
getListView().setItemChecked(-1, true); // The last row from a exception trace finishes here (my class).
}
skutkuje 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)
Zakładając widok Content
nie jest tworzona faktycznie ustawić zmienną boolean
w onActivityCreated()
metody true
i używane if/else
warunek wywołania getListView()
lub nie, który pokazał pomyślne utworzenie widoku aktywności i treści.
Następnie debugowałem, aby zobaczyć, kiedy FragmentPagerAdapter
wywołuje getItem()
i zdarza się, że metoda nie jest wywoływana po zdarzeniu orientation change
. Wygląda na to, że ViewPager
zawiera odniesienia do starego Fragments
. To tylko moje założenie.
Czy jest jakiś sposób na wymuszenie ViewPager
, aby ponownie zadzwonić pod numer getItem()
, więc mogę użyć odpowiednich odniesień do bieżącego Fragments
? Może być jakieś inne rozwiązanie? Dziękuję Ci bardzo.
Nie używam tutaj 'setRetainInstance()'. Problem dotyczy wyjątku, który pojawia się po "zmianie orientacji". Po prostu przyjmuję, że stare Fragmenty są w użyciu, ponieważ sprawdziłem warunek, że dla obu jest wykonywana metoda 'onActivityCreated()'. – Eugene
@siik: Kiedy wywołujesz tę metodę 'refresh()'? A kiedy wyciągasz nowo utworzone fragmenty, aby zapełnić (ick) 'Hashtable'? – CommonsWare
Wywołuję tę metodę 'refresh()' w 'onPageScrollStateChanged()' (która jest implementacją interfejsu 'ViewPager.OnPageChangeListener', tj. Gdy przeskakuję pomiędzy' Fragmentami'). I zapełniam 'HashTable' w metodzie' getItem() 'klasy która rozszerza' FragmentPagerAdapter' – Eugene