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();


就可以起到刷新作用了

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值