TabLayout+ViewPager+Fragment实现切换页面,通知栏跳转

在项目过程中使用标题方式实现滑动页面展示数据,发现从通知栏跳转会出现问题。

具体问题:

当前使用数据源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

你可能感兴趣的:(TabLayout+ViewPager+Fragment实现切换页面,通知栏跳转)