FragmentPagerAdapter和FragmentStatePagerAdapter区别

本文对比分析了FragmentPagerAdapter和FragmentStatePagerAdapter的区别。前者保存所有Fragment,适合页面少的情况;后者仅保留当前Fragment,适合页面多,避免大量内存占用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值