在实际项目中遇到了一个需求,就是点击按钮要改变viewpager中的fragment,而经过尝试 -0- 发现FragmentPagerAdapter中的notifydatasetchanged()并不能起到什么作用...
通过对fragmentpageadapter的源码查看你会在instantiateItem方法里面发现这一段
- // Do we already have this fragment?
- String name = makeFragmentName(container.getId(), position);
- Fragment fragment = mFragmentManager.findFragmentByTag(name);
- if (fragment != ) {
- if (DEBUG) Log.v(TAG, "Attaching item #" + position + ": f=" + fragment);
- mCurTransaction.attach(fragment);
- } else {
- fragment = getItem(position);
- if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment);
- mCurTransaction.add(container.getId(), fragment,
- makeFragmentName(container.getId(), position));
- }
原来他会先去FragmentManager里面去查找有没有相关的fragment如果有就直接使用如果没有才会触发fragmentpageadapter的getItem方法获取一个fragment。所以你更新的fragmentList集合是没有作用的,还要清除FragmentManager里面缓存的fragment。解决办法:在继承的fragmentpageadapter类里面添加一个方法:
- import android.support.annotation.NonNull;
- import android.support.v4.app.Fragment;
- import android.support.v4.app.FragmentManager;
- import android.support.v4.app.FragmentPagerAdapter;
- import android.support.v4.app.FragmentStatePagerAdapter;
- import android.support.v4.app.FragmentTransaction;
- import java.util.ArrayList;
- import java.util.List;
- public class MainViewpagerAdapter extends FragmentStatePagerAdapter {
- private List<Fragment> fragments;
- private FragmentManager fm;
- public MainViewpagerAdapter(FragmentManager fm, List<Fragment> fragments) {
- super(fm);
- this.fm = fm;
- this.fragments = fragments;
- }
- @Override
- public Fragment getItem(int position) {
- return fragments.get(position);
- }
- @Override
- public int getCount() {
- return fragments.size();
- }
- <span style="color:#ff0000;"><strong> @Override
- public int getItemPosition(@NonNull Object object) {
- return POSITION_NONE;//复写pageradapter的getItemPosition方法设置tag为POSITION_NONE意思是没有找到child要求重新加载。
- }
- /**
- * 移除fragments中的数据然后再重新添加fragment
- *
- * @param newFragments
- */
- public void setFragments(ArrayList<Fragment> newFragments) {
- if (fragments != ) {
- FragmentTransaction ft = fm.beginTransaction();
- for (Fragment f : fragments) {
- ft.remove(f);
- }
- ft.commit();
- ft = ;
- fm.executePendingTransactions();
- }
- fragments = newFragments;
- notifyDataSetChanged();
- }</strong></span>
- }