ViewPager刷新遇到的坑

今天写了个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();


就可以起到刷新作用了

我这个情况比较特殊,具体原因,也没有调查出来,有谁知道可以和我说一下,谢谢

猜你喜欢

转载自blog.csdn.net/qq_30711091/article/details/80859918
今日推荐