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.
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.
The fragments should be automatically recreated, just like any fragment is on an configuration change. The exception would be if you used setRetainInstance(true)
, in which case they should be the same fragment objects as before.
So, is there any way to enforce the ViewPager to call getItem() again, so I can use proper references to current Fragments?
What is wrong with the fragments that are there?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With