问题
I'm developing an app with a ViewPager for lateral scrolling tables, sometimes i need to change the adapter to load a different set of tables. I've tried to do the following:
mViewPager.setAdapter(new pagerAdapterPushed(getSupportFragmentManager()));
mViewPager.getAdapter().notifyDataSetChanged();
indicator.setViewPager(mViewPager);
indicator.invalidate();
mViewPager.invalidate();
but it always reload the previous data. Isn't it possibile to change the adapter of a ViewPager?
回答1:
Exactly like my APP doing...
For change ViewPagerAdapter, what I did is :
- Clear all Fragments inside current adapter
- Set current adapter to null
Assign new adpater for ViewPager
/* Clear all Fragments inside current adapter */ public class MyPagerAdapter extends FragmentPagerAdapter { private ArrayList<Fragment> fragments=new ArrayList<Fragment>(); //...some stuff public void clearAll() //Clear all page { for(int i=0; i<fragments.size(); i++) fragMan.beginTransaction().remove(fragments.get(i)).commit(); fragments.clear(); } } /* Set current adapter to null */ Constants.VP.removeAllViews(); Constants.VP.setAdapter(null); /* Assign new adpater for ViewPager */ Constants.PAGER=new MyewPagerAdapter(getSupportFragmentManager()); Constants.VP.setAdapter(Constants.PAGER);
Hope it helps~
回答2:
You need to override public int getItemPosition (Object object) in pager adapter. For every element in the viewpager, you need to return POSITION_UNCHANGED (if it is still in the pager) or POSITION_NONE (if it was removed). Otherwise the view pager won't know something has changed. I wouldn't recommend setting a new adapter, just clearing out the data in the old one.
回答3:
I see that @RRTW way worked for some people but it did not do the trick for me (although it was close). Without 'commitNow()' instead of regular 'commit()' it would not work properly. I did something like that:
private fun changePagerAdapter(newAdapter: PagerAdapter) {
val transaction = supportFragmentManager.beginTransaction()
supportFragmentManager.fragments.forEach {
transaction.remove(it)
}
transaction.commitNow()
view_pager.adapter = newAdapter
}
回答4:
I found a very simple option, I do not know if it's right or wrong, but you can just re-set the adapter
mViewPager.setAdapter(mSectionsPagerAdapter);
It's example for google example project Tabbed Activity for button FloatingActionButton
回答5:
Add this to view pager to reload for next fragment:
viewPager.setCurrentItem()
来源:https://stackoverflow.com/questions/12783571/android-viewpager-change-adapter