前言
在使用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适合页面较多,不会占据大量的内存。