有关FragmentPagerAdapter适配器中的fragment数据刷新问题

有很多时候会需要用到选项卡式的布局,如果没有特殊情情况一般不需要在viewPager 所在activity中更改数据。但是如果需要更改刷新如何处理?比如我加个筛选项就需要实时的刷新fragment中的数据

当数据发生改变调用fragmentPagerAdapter 的notifyDataChanged方法发现数据根本就没有刷新。网络上会提到PageAdapter刷新方案如下代码:
复写PagerAdapterer的getItemPosition方法设置tag为POSITION_NONE意思是没有找到child要求重新加载。

@Override
public int getItemPosition(Object object) {//没有找到child要求重新加载。
return POSITION_NONE;
}
结果你发现是刷新了一下但内容还是原始的数据。通过对fragmentpageadapter的源码查看你会在instantiateItem方法里面发现这一段

// Do we already have this fragment?
String name = makeFragmentName(container.getId(), position);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
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如果有就直接使用如果没有才会触发fragmentPagerAdapter的getItem()获取一个fragment.所以你更新的fragmentList集合是没有作用的,还要清除FragmentManger里面的缓存的fragment.
所有如果不是viewPager中的元素个数增加或者减少调用notifycationSetChange方法是不好使用的。就不会执行适配器中的getItem方法,那正确的方法就是缓存的fragment给移除,重新设置fragment.

初始化适配器并设置

mFragments = new ArrayList<>();
mFragments.add(ApplyChildFragment01.newInstance(status, StartDay, LastDate));
mFragments.add(ApplyChildFragment01.newInstance(status, StartDay, LastDate));
mFragments.add(ApplyChildFragment01.newInstance(status, StartDay, LastDate));
mFragments.add(ApplyChildFragment01.newInstance(status, StartDay, LastDate));
adapter = new OrderFragmentAdapter(getSupportFragmentManager(), mFragments, vpContent);
viewpager.setAdapter(adapter);
adapter.notifyDataSetChanged();
当有数据发生变化时调用
mFragments = new ArrayList<>();
mFragments.add(ApplyChildFragment01.newInstance(status, StartDay, LastDate));
mFragments.add(ApplyChildFragment01.newInstance(status, StartDay, LastDate));
mFragments.add(ApplyChildFragment01.newInstance(status, StartDay, LastDate));
mFragments.add(ApplyChildFragment01.newInstance(status, StartDay, LastDate));
adapter.setFragments(mFragments);
adapter.notifyDataSetChanged();

适配器:
public class OrderFragmentAdapter extends FragmentPagerAdapter {
private List fragments;
private String[] mTitles;
private FragmentManager fm;
private boolean[] fragmentsUpdateFlag = {false,false};

public void setFragments(List<Fragment> fragments){
    if (this.fragments != null) {
        FragmentTransaction ft = fm.beginTransaction();
        for (Fragment f : this.fragments) {
            ft.remove(f);
        }
        ft.commit();
        ft = null;
        fm.executePendingTransactions();
    }
    this.fragments = fragments;
    notifyDataSetChanged();
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    Fragment fragment = (Fragment)super.instantiateItem(container, position);
    //得到tag ❶
    String fragmentTag = fragment.getTag();
    if (fragmentsUpdateFlag[position % fragmentsUpdateFlag.length]) {
        //如果这个fragment需要更新
        FragmentTransaction ft = fm.beginTransaction();
        //移除旧的fragment
        ft.remove(fragment);
        //换成新的fragment
        fragment = fragments.get(position % fragments.size());
        //添加新fragment时必须用前面获得的tab
        ft.add(container.getId(), fragment, fragmentTag);
        ft.attach(fragment);
        ft.commit();

        //复位更新标志
        fragmentsUpdateFlag[position % fragmentsUpdateFlag.length] = false;
    }
    return fragment;
}

@Override
public int getItemPosition(Object object) {//没有找到child要求重新加载。
    return POSITION_NONE;
}

public OrderFragmentAdapter(FragmentManager fm, List<Fragment> fragments, String[] titles) {
    super(fm);
    mTitles = titles;
    this.fragments = fragments;
    this.fm = fm;

}

@Override
public Fragment getItem(int position) {
    Fragment fragment = fragments.get(position % fragments.size());
    LatteLogger.i("TAG", "getItem:position=" + position + ",fragment:"
            + fragment.getClass().getName() + ",fragment.tag="
            + fragment.getTag());
    return fragments.get(position % fragments.size());
}


@Override
public int getCount() {
    return fragments.size();
}

@Nullable
@Override
public CharSequence getPageTitle(int position) {
    return mTitles[position];
}

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值