Reputation: 405
I'm populating view pager through fragments likes this
pagerAdapter = new PagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.container);
for (int i = 0; i < 10; i++) {
newfragment fragobj = new newfragment();
fragobj.setArguments(bundle);
pagerAdapter.addFragment(fragobj, "Category");
}
mViewPager.setAdapter(pagerAdapter);
mViewPager.setCurrentItem(page);
I want to clear all fragments and add new fragments after clearing. If I add new fragments now it ads on with old fragments.
I tried many stack overflow answers but none of them worked for me.
Upvotes: 7
Views: 18503
Reputation: 86
I use navController fragment and in one fragment I also had viewPager with few slides set in a "parent fragment, which was part of the nav tree".
Sadly after the parent fragment was destoryed, the frags created within it for view pager were not getting cleared and they were restored while resuming the app, even tho they couldn't be shown!!
I've set adapter to null in parent's fragment onDestroy()-. and it clears all frags used inside viewPager.
If you have similiar problem, this wokrs 100%.
Upvotes: 2
Reputation: 2138
With ViewPager2
(1.0.0) and FragmentStateAdapter
I also found the current view not to be recreated after updating the data set using notifyDataSetChanged
, even when the data corresponding to the current view is changed. Apparently, notifyDataSetChanged
doesn't perform a very thorough investigation of what has been changed and assumes the current view to be still correct.
The workaround I found was to simply set the same adapter that I had already set for the previous data set again:
viewPager2.setAdapter(myFragmentStateAdapter);
Apparently, setting an adapter makes it flush the cached views, which makes very good sense of course. Luckily, it doesn't check whether it's the same adapter.
Upvotes: 1
Reputation: 214
Add this method in ViewPagerAdapter and call it when you want to clear fragments from viewPager
public void clear() {
FragmentTransaction transaction = manager.beginTransaction();
for (Fragment fragment : mFragmentList) {
transaction.remove(fragment);
}
mFragmentList.clear();
transaction.commitAllowingStateLoss();
}
Upvotes: 8
Reputation: 1755
the fragment was already getting removed and destroyed. the issue was of viewpages.
Only this worked for me
myViewPager.setSaveFromParentEnabled(false);
Cheers !
Upvotes: 21
Reputation: 9117
mViewPager : is the view you are using to set you Fragment
mViewPager = (YourViewPager) findViewById(R.id.myPager);
TABLE : is just a Integer list of the position of all my Fragments
public void destroyAllItem() {
int mPosition = mViewPager.getCurrentItem();
int mPositionMax = mViewPager.getCurrentItem()+1;
if (TABLE.size() > 0 && mPosition < TABLE.size()) {
if (mPosition > 0) {
mPosition--;
}
for (int i = mPosition; i < mPositionMax; i++) {
try {
Object objectobject = this.instantiateItem(mViewPager, TABLE.get(i).intValue());
if (objectobject != null)
destroyItem(mViewPager, TABLE.get(i).intValue(), objectobject);
} catch (Exception e) {
Log.i(TAG, "no more Fragment in FragmentPagerAdapter");
}
}
}
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
if (position <= getCount()) {
FragmentManager manager = ((Fragment) object).getFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove((Fragment) object);
trans.commit();
}
}
Upvotes: 1