今天写了个ViewPager+Fragment,切换,刷新Fragment数据的demo,写的吐血
1.
for (int i = 0; i < mCategoryEntityList.size(); i++) { DefualInfoFragment meFragment = new DefualInfoFragment(); Bundle bundle = new Bundle(); bundle.putString(Constant.CHANNEL_CODE, mCategoryEntityList.get(i).toString()); meFragment.setArguments(bundle); fragments.add(meFragment); } adapter = new NewsPagerAdapter(getChildFragmentManager(), fragments); mViewPager.setAdapter(adapter);
循环四个Fragment加到list中,到这里都没问题
这时候,我准备点击加号,改变Fragment的顺序
然后调用
notifyDataSetChanged()
我去,竟然没有用
百度发现,出现这种原因,是因为ViewPager具有缓存作用,他默认会缓存三个Fragment,当前,左边,右边
而且在adapter生成Fragment时,会给Fragment加上name
这样的作用就是,当你再点击这个Fragment时,它会去寻找它的name是否存在,如果没有就生成,存在就不会刷新
所以我改变的Fragment中List的顺序,并不能起到刷新的作用
知道原因,就可以很好的找到方法了
解决:
1.在adapter中修改
private int mChildCount = 0; @Override public void notifyDataSetChanged() { // 重写这个方法,取到子Fragment的数量,用于下面的判断,以执行多少次刷新 mChildCount = getCount(); super.notifyDataSetChanged(); } @Override public int getItemPosition(Object object) { if ( mChildCount > 0) { // 这里利用判断执行若干次不缓存,刷新 mChildCount --; // 返回这个是强制ViewPager不缓存,每次滑动都刷新视图 return POSITION_NONE; } // 这个则是缓存不刷新视图 return super.getItemPosition(object); }
这样每次都会刷新
2.在显示界面中
if (mViewPager.getAdapter() != null) { FragmentManager fm = getChildFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); List<Fragment> fragments = fm.getFragments(); if (fragments != null && fragments.size() > 0) { for (int i = 0; i < fragments.size(); i++) { ft.remove(fragments.get(i)); } } ft.commit(); } fragments.clear(); for (int i = 0; i < mCategoryEntityList.size(); i++) { DefualInfoFragment meFragment = new DefualInfoFragment(); Bundle bundle = new Bundle(); bundle.putString(Constant.CHANNEL_CODE, mCategoryEntityList.get(i).toString()); meFragment.setArguments(bundle); fragments.add(meFragment); }
把缓存的Fragment去掉
注意:当布局是Fragment套Fragment时,用getChildFragmentManager,不能使用getSupportFragmentManager或getFragmentManager,这两个可以在Activity中使用
我遇到最坑爹的是,它竟然与MagicIndicator冲突,调用刷新,会导致页面空白
最终没有办法,我只能adapter
adapter = new NewsPagerAdapter(getChildFragmentManager(), fragments); mViewPager.setAdapter(adapter); commonNavigator.notifyDataSetChanged(); adapter.notifyDataSetChanged();
最后问题解决
当然,一般只需上面两段代码在用
adapter.notifyDataSetChanged();
就可以起到刷新作用了
我这个情况比较特殊,具体原因,也没有调查出来,有谁知道可以和我说一下,谢谢