如何在ViewPager中重用Fragment instace?

时间:2018-08-30 08:26:31

标签: android android-viewpager

我的应用程序中有一个ViewPager,该Viewpager包含10个相同的片段,但带有不同的参数。使用FragmentStatePagerAdapter作为viewpager的适配器。选择页面后,FragmentStatePagerAdapter会先创建新实例,然后销毁它。但我不需要10个实例。 3就足够了。当用户向右滚动时,大多数左片段可以重复使用,因为GC很昂贵。如何实现?

2 个答案:

答案 0 :(得分:0)

当您覆盖getItem的{​​{1}}函数时,请保留对每个片段的引用,并仅在null时实例化它们:

FragmentStatePagerAdapter

10个片段中的每个片段仅被实例化一次,而10个片段中的每个片段仅在用户从视图中滑动1时才被实例化。

建议像其他用户一样调用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 :(得分:0)

据我所知,除非您的片段实例具有大量属性,否则销毁和创建实例应该不是什么大问题。 (特别考虑具有高功率CPU和RAM的现代android设备)

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

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

现在这是其背后的基本逻辑,但确实值得实现所有这些(尤其是#4)。

非常抱歉,因为我从未尝试实现这种方式,所以我无法向您显示实际的代码片段。

希望有帮助。