有很多时候会需要用到选项卡式的布局,如果没有特殊情情况一般不需要在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];
}
}