在项目过程中使用标题方式实现滑动页面展示数据,发现从通知栏跳转会出现问题。
具体问题:
当前使用数据源A,会new出多个Fragment,滑动页面,确保展示多个Fragment,然后从通知栏跳转进入,因为需求会导致初始页面不在第一个页面,可能会在第五或者其他页面,跳转出现的第一个页面没有问题,但是往前滑动,发现部分页面数据不刷新。
开始查找网上的方法使用在FragmentPagerAdapter中添加如下代码,强制刷新的方式:
private int mChildCount= 0;
@Override
public void notifyDataSetChanged() {
// 重写这个方法,取到子Fragment的数量,用于下面的判断,以执行多少次刷新
mChildCount= getCount();
super.notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
if (mChildCount> 0) {
// 这里利用判断执行若干次不缓存,刷新
mChildCount--;
// 返回这个是强制ViewPager不缓存,每次滑动都刷新视图
return POSITION_NONE;
}
// 这个则是缓存不刷新视图
return super.getItemPosition(object);
}
加上
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
List fragments = fragmentManager.getFragments();
if (fragments != null && fragments.size() > 0) {
for (int i = 0; i < fragments.size(); i++) {
fragmentTransaction.remove(fragments.get(i));
}
}
fragmentTransaction.commit();
加上在加载完新数据后调用
adapter.notifyDataSetChanged();
结果发现在跳转前在第一页,跳转后也在第一页才可以生效,PASS。
跟进代码发现在初始化页面时position会先为0,在因为预加载会为1,之后如果你跳转的Fragment的位置为6的话,position才会依次为6,5,7
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
猜测是因为Fragment缓存的问题,所以导致系统认为Fragment不用刷新,查阅相关资料,发现是因为使用了FragmentPagerAdapter,这个Adapter会把之前展示过的所有Fragment存到内存中,适用于少量固定的Fragment;如果要展示大量的Fragment的话,还是要使用FragmentStatePagerAdapter,它会把不展示的Fragment销毁掉,但是还是可以很好的保留预加载特性,这样大量的Fragment占用内存也不大。
解决方法:
clear源数据Fragment列表,然后把FragmentPagerAdapter替换为FragmentStatePagerAdapter即可。
PS:文章中说要再加上
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
来触发销毁对象以及重建对象。我这里没有加上也可以生效,有待研究。
参考文章:
https://blog.csdn.net/qq_30740239/article/details/53462417
网友评论