FragmentStatePagerAdapter与FragmentPagerAdapter

ViewPager是我们经常使用的一个组件,而这个组件经常和Fragment结合在一起用,可以完成滑动来显示不同的Fragment。我们要管理这里面的Fragment的切换,可以使用PagerAdapte。

PagerAdapter是提供给ViewPager的Pages的适配器,而FragmentPagerAdapter与FragmentStatePagerAdapter都是继承自PagerAdapter这个基类,是PagerAdapter的两种实现。

我们先通过源码来了解设计者的设计目的。

FragmentStatePagerAdapter与FragmentPagerAdapter_第1张图片
FragmentStatePagerAdapter与FragmentPagerAdapter_第2张图片

FragmentPagerAdapter的整个流程就是 add -> detach -> attach -> detach -> ...因为用的是detach和attach的路,所以系统会保存Fragment的State。它适用于基本的使用场景,但是如果是有大量的Tab的情况,FragmentPagerAdapter就不太适用了,因为它的状态都用系统保存常驻在内存之中了,并且Fragment的实例也常驻在内存,会导致大量的内存占用

FragmentStatePagerAdapter与FragmentPagerAdapter_第3张图片
FragmentStatePagerAdapter与FragmentPagerAdapter_第4张图片

不同于FragmentPagerAdapter,FragmentStatePagerAdapter的机制是: add -> save state -> remove -> initial state -> add -> ...FragmentStatePagerAdapter是采用remove的方式销毁Fragment,但活动的Fragment实例保存在mFragments之中,在destroyItem方法内又会被移除,但是状态不会被删除,总是保存在mSavedState集合之中

结论:

FragmentPagerAdapter使用add, attach, detach来管理Fragment,Fragment实例和状态都被保存下来,但是重建的消耗不高,生命周期在onAttach和onDetach间切换,典型的用内存换效率的做法。而FragmentStatePagerAdapter使用add, remove来管理Fragment,被销毁的Fragment实例不再存在,但是其状态保存在集合之中,以便下次重建实例时能够还原之前的状态

适用情况:

FragmentPagerAdapter适用于Fragment比较少的情况,因为我们会把每一个Fragment保存在内存中,用户体验比较好。而对于Fragment比较多的情况,需要切换的时候销毁以前的Fragment以释放内存,就可以使用FragmentStatePagerAdapter

你可能感兴趣的:(FragmentStatePagerAdapter与FragmentPagerAdapter)