Android关于ViewPager+Fragment缓存问题
场景需求
在ViewPager里根据后台返回,动态New添加N个同类型Fragment碎片对象
出现问题
第一次添加N个Fragment并赋值,没有任何问题。
第二次切换新的N个Fragment并赋值,出现赋值了之后,Fragment中还是之前赋值的参数。
问题解决
ViewPager.FragmentPagerAdapter 重写回调方法:getItemId
mBinding.vpager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager(), BEHAVIOR_SET_USER_VISIBLE_HINT){
@NonNull
@Override
public CustomFragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
//重写该回调方法即可解决
@Override
public long getItemId(int position) {
return getItem(position).hashCode();
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return getItem(position).initTitle();
}
});
原理
getItemId 在ViewPager中作为区分缓存对象的条件
在debug的过程中,可以发现如果不重写getItemId方法,第二次添加新的Fragment并赋值的时候,赋值对象的hashCode一直跟第一次一样。