android中viewPager搭配Fragment重新加载后,还是显示之前数据
开始我尝试清掉fragmentList,fragmentList.clear();
但是重新再加载viewPager时,发现还是会使用已经创建的fragment
解决方案
一、更新adapter数据前先清除FragmentManager中的数据
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (fragmentList.size() > 0) {
for (Fragment fragment : fragmentList) {
ft.remove(fragment);
}
ft.commitNow();
fragmentList.clear();
adapter.notifyDataSetChanged();
}
注意:要刷新adapter
二、~~FragmentAdapter中重写getItemPosition方法,测试中发现没用,原因得问问大佬们~~
自定义FragmentPagerAdapter中重写该方法
@Override
public int getItemPosition(@NonNull Object object) {
return PagerAdapter.POSITION_NONE;
}
三、~~FragmentAdapter中清除fragment缓存,测试中发现也没有用~~
public void clearAll() {
//先保证ViewPager之前已设置过Adapter,这样才有可能存在缓存
//获取FragmentManager实现类的class对象,这里指的就是FragmentManagerImpl
Class<? extends FragmentManager> aClass = fm.getClass();
try {
//1.获取其mAdded字段
Field f = aClass.getDeclaredField("mAdded");
f.setAccessible(true);
//强转成ArrayList
ArrayList<Fragment> list = (ArrayList) f.get(fm);
//清空缓存
list.clear();
//2.获取mActive字段
f = aClass.getDeclaredField("mActive");
f.setAccessible(true);
//强转成SparseArray
SparseArray<Fragment> array = (SparseArray) f.get(fm);
//清空缓存
array.clear();
} catch (Exception e) {
e.printStackTrace();
}
}
记得使用第一种方案,第二第三中都未生效,放出来只是想问问大佬们