我的应用程序中有一个ViewPager,该Viewpager包含10个相同的片段,但带有不同的参数。使用FragmentStatePagerAdapter
作为viewpager的适配器。选择页面后,FragmentStatePagerAdapter
会先创建新实例,然后销毁它。但我不需要10个实例。 3就足够了。当用户向右滚动时,大多数左片段可以重复使用,因为GC很昂贵。如何实现?
答案 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设备)
但是要回答您的“如何实现”问题...
ViewPagerAdapter.getItem()
,都要从池中获取一个片段实例并返回它。现在这是其背后的基本逻辑,但确实值得实现所有这些(尤其是#4)。
非常抱歉,因为我从未尝试实现这种方式,所以我无法向您显示实际的代码片段。
希望有帮助。