如何在ViewPager中重用Fragment实例?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在ViewPager中重用Fragment实例?相关的知识,希望对你有一定的参考价值。
我的应用程序中有一个ViewPager,这个viewpager包含10个具有不同参数的相同片段。使用FragmentStatePagerAdapter
作为viewpager的适配器。 FragmentStatePagerAdapter
在选择页面时预先制作新实例,然后将其销毁。但我不需要10个实例。 3就够了。当用户向右滚动时,大多数左侧片段可以重复使用,因为GC很昂贵。怎么实现呢?
当您覆盖getItem
的FragmentStatePagerAdapter
函数时,请维护对每个片段的引用,并仅在null时实例化它们:
private MyFragment myFragment0, myFragment1, myFragment2, ...;
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
if (myFragment0 == null) {
myFragment0 = new MyFragment();
}
return myFragment0;
case 1:
if (myFragment1 == null) {
myFragment1 = new MyFragment();
}
return myFragment1;
case 2:
if (myFragment2 == null) {
myFragment2 = new MyFragment();
}
return myFragment2;
...
}
}
10个片段中的每一个将仅被实例化一次,并且一旦用户1轻扫远离观看它,则仅10个片段中的每一个将被实例化。
像一个不同的用户建议调用viewPager.setOffscreenPageLimit(10)
有类似的效果,但它实际上导致一旦你设置适配器实例化所有10个片段,这可能会冻结应用程序一段时间,因此不推荐。
据我所知,除非你的片段实例有很多属性,否则破坏和创建实例应该不是什么大问题。 (特别是考虑具有高功率CPU和RAM的现代android设备)
但要回答你的“如何实现”问题......
- 您需要一个池来管理片段实例。这将创建,保留和销毁(必要时)片段实例。
- 每当调用
ViewPagerAdapter.getItem()
时,从池中获取一个片段实例并将其返回。 - 如果池的实例少于3个,请创建一个并返回它。否则,返回不再使用的实例。
- 要确定不再使用的实例,请跟踪哪个片段实例表示哪个页面,当前页面是什么以及页面将要查看的方式。
现在这是它背后的基本逻辑,但它真的值得实现所有(特别是#4)。
我真的很抱歉我无法向您展示实际的代码片段,因为我从未尝试过这样的方式。
希望能帮助到你。
以上是关于如何在ViewPager中重用Fragment实例?的主要内容,如果未能解决你的问题,请参考以下文章
重用 ViewPager 和 FragmentPagerAdapter 的片段
Android中ViewPager实现滑动条及与Fragment结合的实例教程
android ViewPager+Fragment 如何在ViewPager的Activity中获取Fragment中的控件对象
Android——Fragment实例精讲——底部导航栏+ViewPager滑动切换页面