I have a ViewPager
(extends FragmentPagerAdapter
) which holds two Fragments
. What I need is just refresh a ListView
for each Fragment
when I swipe among them. For this I have implemented ViewPager.OnPageChangeListener
interface (namely onPageScrollStateChanged
). In order to hold references to Fragment
s I use a HashTable
. I store references to Fragments
in HashTable
in getItem()
method:
@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;
}
}
So when I swipe from one Fragment
to another the onPageScrollStateChanged
triggers where I use the HashTable
to call required method in both Fragments
(refresh):
public void refreshList() {
((ItemsListFragment) mPageReferenceMap.get(0)).refresh();
((ItemsFavsListFragment) mPageReferenceMap.get(1)).refresh();
}
Everything goes fine until orientation change
event happens. After it the code in refresh()
method, which is:
public void refresh() {
mAdapter.changeCursor(mDbHelper.getAll());
getListView().setItemChecked(-1, true); // The last row from a exception trace finishes here (my class).
}
results 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)
Assuming the Content
view is not created indeed I set the boolean
variable in onActivityCreated()
method to true
and used if/else
condition to call getListView()
or not, which shown the activity and content view successfully created.
Then I was debugging to see when FragmentPagerAdapter
invokes getItem()
and it happens the method is not called after orientation change
event. So looks like it ViewPager
holds references to old Fragments
. This is just my assumption.
So, is there any way to enforce the ViewPager
to call getItem()
again, so I can use proper references to current Fragments
? May be some other solution? Thank you very much.