FragmentStatePagerAdapter如何保存恢复下拉刷新Fragment内存数据(fragment,fragmentstatepageradapter,开发技术)

时间:2024-05-05 11:38:28 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    FragmentStatePagerAdapter%E5%A6%82%E4%BD%95%E4%BF%9D%E5%AD%98%E6%81%A2%E5%A4%8D%E4%B8%8B%E6%8B%89%E5%88%B7%E6%96%B0Fragment%E5%86%85%E5%AD%98%E6%95%B0%E6%8D%AE

如果对于新开发的功能,建议使用 ViewPager2 + FragmentStateAdapter 来构建; 对于需要维护的项目,且项目中使用到 ViewPage + FragmentStatePagerAdapter,还是需要学习下 FragmentStatePagerAdapter 的一些用法的。

FragmentStatePagerAdapter,适用于多个Fragment的场景,默认情况下会在内存中保留3个Fragment,当前Fragment、左侧及右侧Frgment,在已经都访问一遍的情况下,其他的Fragment会被销毁掉(即走了onDestory)

如第一个GIF图所示,将Fragment的网络数据保存到内存中,然后下次Fragment再次构建时使用内存中数据。

首先有五个Fragment,分别是Fragment0 - Fragment4。

(1)第一步:进入到该首页后,从左到右滑动到最后一个Fragment,加载网络数据并填充到对应的Fragment中。

(2)第二步:从右到左依次滑动到第一个Fragment,此时可以看到 Fragment3 及 Fragment4 展示的是网络数据,而Fragment0 到 Fragment3 展示的内存数据。

这是因为在第一步时,当界面展示最后一个Fragment的时候,这个时候仅有Fragment3 及 Frgment4 是存活的,其他Fragment均被销毁掉了。在销毁Fragment之前干了一件事,将数据保存到内存中去,当销毁掉的Fragment再次被构建时,将之前保存下来的数据填充到新构建的Fragment中展示。

(3)第三步:再次从左到右滑动到最后一个Fragment,此时可以看到所有的Fragment使用的都是内存数据了。道理同上

仅在Fragment中做两件事情即可:

(1)保存Fragment数据到内存中, 重写onSaveInstanceState方法

(2)从内存中恢复Fragment数据,在onCreateView方法中的判断参数savedInstanceState不为null,取其参数中的数据

如第二个GIF图所示,下拉刷新后,请求最新的网络数据填充到Fragment中

(1)在当前Fragment4页面下,进行下拉刷新

(2)下拉刷新的数据回来后,刷新当前页面,展示最新的网络数据

(3)从右滑动到左时,能够看到所有的Fragment页面均是请求了最新的数据

这里面有几个注意的点:

(1)下拉刷新后,仅在当前页面显示时才会进行该页面的网络请求,而不是将所有Fragment页面都进行网络请求

(2)对应Fragment4而言,因为下拉刷新后,Fragment4 及 Fragment3 是存活状态,因此需要单独地处理它们的刷新(其实这里需要考虑地是当前Fragment及其左右的Fragment)

(3)而对应非Fragment4、Fragment3的Fragment们,因为已经被销毁掉了,所以只需要在下拉刷新后,将它们的内存数据清除掉就可以了,这样下次构建的时候,没有内存数据,则会重新请求网络数据展示的。

关于下拉刷新的可以参考这篇文章Android:对现有布局添加自定义的下拉刷新布局(阻尼滑动、悬停、回弹动画效果)

FragmentStatePagerAdapter在销毁Fragment的时候,会调用destoryItem方法,从而间接地调用了Fragment的onSaveInstanceState方法来保存数据。

因此,仅需要在Fragment中重写onSaveInstanceState方法

在构建Fragment的时候,可以充分地利用onCreateView方法中的Bundle类型的savedInstanceState参数:

下拉刷新,是将所有Fragment的数据都刷新成最新的网络数据,因此在下拉刷新后,要做下面几件事:

(1)想办法刷新当前还活着的Fragment

如第二个GIF图所示,当在Fragment4的时候,下拉刷新,则此时活着的Fragment就只剩下Fragment4及Fragment3了,那么如何刷新Fragment4及Fragment3呢?

1)刷新Fragment4

因为是在Fragment4页面进行下拉刷新的,所以可以在下拉刷新回调事件中调用:

在回调中,刷新当前页面的时候需要获取当前的Fragment,而Fragment都是由Adapter管理的,所以怎么获取到呢?可以使用反射去取:参考这个getCurrentFragment方法

2)刷新Fragment3

因为Fragment3此时并没显示,可以做一个position标记,记录下当切换到Fragment3的时候,进行网络请求并刷新。因此,在回调中,看到的是记录左边位置(如果左边位置不存在,则赋值-1)

在ViewPager中的页面切换回调中,拿到position和mLeftRefresh对比,如果相同则请求网络数据并刷新:

(2)想办法刷新已经销毁掉的Fragment

已经销毁掉的Fragment,其内存数据保存在mSavedState列表中

因此,需要做的就是在下拉刷新之后,将这个mSavedState列表数据进行清空即可。

到这个,你可能有思路了,就是反射取FragmentStatePagerAdapter的这个mSaveState私有属性做clear即可

本文:FragmentStatePagerAdapter如何保存恢复下拉刷新Fragment内存数据的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:怎么使用Pandas实现MySQL日期函数下一篇:

2 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18