在fragmentpageadapter的instantiateItem方法里,他会先去FragmentManager里面去查找有没有相关的fragment如果有就直接使用如果没有才会触fragmentpageadapter的getItem方法获取一个fragment。所以你更新fragments集合是没有作用的。
这个方案还是在instantiateItem方法里作文章,代码如下:
@Override
public Object instantiateItem(ViewGroup Container,int position) {
//得到缓存的fragment
Fragment fragment = (Fragment)super.instantiateItem(container,
position);
//得到tag
String fragmentTag = fragment.getTag();
//如果这个fragment需要更新
FragmentTransaction ft =fm.beginTransaction();
//移除旧的fragment
ft.remove(fragment);
//换成新的fragment
fragment =fragments[position %fragments.length];
//添加新fragment时必须用前面获得的tag
ft.add(container.getId(), fragment, fragmentTag);
ft.attach(fragment);
ft.commit();
}
return fragment;
}
代码注释得很清楚了,主要思路就是用新的fragment替换FragmentManager里缓存的旧的fragment,重点解释 (得到tag )的地方
FragmentPagerAdapter里的instantiateItem有两条代码:
String name = makeFragmentName(container.getId(), position);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
说明fragmentpageadapter内部是用tag识别fragment的,并且有它自己的一套算法用于生成tag,所以我们这里必须用它生成的tag来添加新的fragment,否则fragmentpageadapter就无法识别这个新的fragment。
FragmentPagerAdapter还必须重写:
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
从而让ViewPager重绘所有item。