项目中遇到过一个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;
}
}