如何在ViewPager中重用Fragment实例?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在ViewPager中重用Fragment实例?相关的知识,希望对你有一定的参考价值。

我的应用程序中有一个ViewPager,这个viewpager包含10个具有不同参数的相同片段。使用FragmentStatePagerAdapter作为viewpager的适配器。 FragmentStatePagerAdapter在选择页面时预先制作新实例,然后将其销毁。但我不需要10个实例。 3就够了。当用户向右滚动时,大多数左侧片段可以重复使用,因为GC很昂贵。怎么实现呢?

答案

当您覆盖getItemFragmentStatePagerAdapter函数时,请维护对每个片段的引用,并仅在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设备)

但要回答你的“如何实现”问题......

  1. 您需要一个池来管理片段实例。这将创建,保留和销毁(必要时)片段实例。
  2. 每当调用ViewPagerAdapter.getItem()时,从池中获取一个片段实例并将其返回。
  3. 如果池的实例少于3个,请创建一个并返回它。否则,返回不再使用的实例。
  4. 要确定不再使用的实例,请跟踪哪个片段实例表示哪个页面,当前页面是什么以及页面将要查看的方式。

现在这是它背后的基本逻辑,但它真的值得实现所有(特别是#4)。

我真的很抱歉我无法向您展示实际的代码片段,因为我从未尝试过这样的方式。

希望能帮助到你。

以上是关于如何在ViewPager中重用Fragment实例?的主要内容,如果未能解决你的问题,请参考以下文章

重用 ViewPager 和 FragmentPagerAdapter 的片段

Android中ViewPager实现滑动条及与Fragment结合的实例教程

android ViewPager+Fragment 如何在ViewPager的Activity中获取Fragment中的控件对象

Android——Fragment实例精讲——底部导航栏+ViewPager滑动切换页面

如何在 Fragment 对象中控制 ViewPager 更改页面

在Viewpager中的一个Fragment中添加一个ViewPager