FragmentPageAdapter重新setData()显示空白解决方法

项目中遇到过一个fragemnt嵌套ViewPager,ViewPager内部填充新的Fragment。然后外层的fragment有个下拉需求,因为项目用的是FragmentPageAdapter,本来以为调用adapter.setData()方法可以轻松实现刷新,果然还是太天真,各种折腾之下又百思不得其解。最后发现调试发现刷新数据没有调用getItgem()方法。具体是因为fragmentPageAdapter内部的fragmentManager会缓存我们的fragment,每次刷新的时候会调用Fragment fragment = mFragmentManager.findFragmentByTag(name);这句代码,这里FragmentManager是通过tag别名的方式来从缓存中查找对应的Fragment,其tag的命名是有一套命名规范的,是通过ViewPager的id和getItemId的返回值来生成tag.。因此改变getItemID()的返回值就可以了。个人解决方法如下:

public class NewPageAdapter extends FragmentPagerAdapter {
ArrayList datas;
ArrayList titles;
private int count =1;
//保存一个IDList,在getItemID()方法返回对应的ID
private List pageNames = new ArrayList();

public NewPageAdapter(FragmentManager fm) {
    super(fm);
}

public ArrayList<String> getTitles() {
    return titles;
}

public void setData(ArrayList<Fragment> datas) {
    this.datas = datas;
    //重新赋值viewpagerId,防止重复
    count++;
    pageNames.clear();
    for(int i =0;i<datas.size();i++){
        pageNames.add((titles.get(i)+count).hashCode());
    }
}

public void setTitles(ArrayList<String> titles) {
    this.titles = titles;
}

public void removeAllFragment() {
    if (datas != null)
        datas.clear();
}

@Override
public Fragment getItem(int position) {
    return datas == null ? null : datas.get(position);
}

@Override
public int getCount() {
    return datas == null ? 0 : datas.size();
}

@Override
public CharSequence getPageTitle(int position) {
    return titles == null ? null : titles.get(position);
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
}

@Override
public long getItemId(int position) {
    return pageNames.get(position);
}

@Override
public int getItemPosition(@NonNull Object object) {
    return POSITION_NONE;
}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值