FragmentPagerAdapter和FragmentStatePagerAdapter区别

前言

在使用Fragment时,我们有没有了解过Fragment俩种适配器呢?今天我们来研究下FragmentPagerAdapter和FragmentStatePagerAdapter二者的区别。

FragmentPagerAdapter

首先我们来看一下FragmentPagerAdapter的destroyItem方法源码

   public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        if (this.mCurTransaction == null) {
            this.mCurTransaction = this.mFragmentManager.beginTransaction();
        }

        this.mCurTransaction.detach((Fragment)object);
    }
复制代码

方法最后调用了detach方法,将Fragment的View销毁,而Fragment对象还存在。FragmentPagerAdapter会将每一个生成的Fragment保存在内存中,所以只适用于页面较少的情况。如果页面比较多,内存占用较大,用户体验会不好。

FragmentStatePagerAdapter

我们还是看一下FragmentStatePagerAdapter的destroyItem方法,看一是如何处理的。

 public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        Fragment fragment = (Fragment)object;
        if (this.mCurTransaction == null) {
            this.mCurTransaction = this.mFragmentManager.beginTransaction();
        }

        while(this.mSavedState.size() <= position) {
            this.mSavedState.add((Object)null);
        }

        this.mSavedState.set(position, fragment.isAdded() ? this.mFragmentManager.saveFragmentInstanceState(fragment) : null);
        this.mFragments.set(position, (Object)null);
        this.mCurTransaction.remove(fragment);
    }
复制代码

可以看出跟FragmentPagerAdapter不同的是,最后调用了remove方法。会将Fragment删除并释放资源,也就是说保留当前Fragment,当Fragment离开后,就会被消除,然后释放资源。

总结

通过分析,可以得知FragmentPagerAdapter适合页面较少的情况。FragmentStatePagerAdapter适合页面较多,不会占据大量的内存。

转载于:https://juejin.im/post/5bfe66306fb9a049de6d11fd

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值