美文网首页
TabLayout+ViewPager+Fragment实现切换

TabLayout+ViewPager+Fragment实现切换

作者: 军如令 | 来源:发表于2018-07-30 16:16 被阅读0次

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

    具体问题:

    当前使用数据源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实现切换

          本文链接:https://www.haomeiwen.com/subject/vxjfvftx.html