防止ViewPager破坏屏幕外的视图


133

我有一个ViewPager连接到显示三个片段的FragmentPagerAdapter。当离开当前位置一个或多个滑动时,ViewPager似乎会破坏宿主片段的视图。

这些视图都是简单的列表,完全不需要这种优化,因此我想禁用它。这引起了一些视觉问题,因为列表中应用了布局动画,并且销毁并重新创建了这些动画,然后对其进行重放。它还每次都会显示滚动条简介动画(滚动条短暂可见以表明可以滚动),这可能会分散注意力,并且用户的当前滚动位置会在此过程中丢失。

在第一次滑动之前,它也不会加载第三个片段,这是有问题的,因为每个片段都处理自己的服务调用,我希望在活动加载时同时触发所有三个片段。延迟第三次服务呼叫并不理想。

有什么办法说服ViewPager停止这种行为,并将所有片段保留在内存中?

Answers:


332

在支持包的修订版4中,向ViewPager添加了一种方法,该方法允许您指定要使用的屏幕外页面的数量,而不是默认值1。

对于您的情况,您想指定2,这样当您在第三页上时,第一页不会被破坏,反之亦然。

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);

知道如何在Coverflow上执行此操作吗?
josephus 2012年

4
你好。在我正在研究的内容中,片段/页面是动态创建的,因此存在无限数量的可能片段。在这种情况下,通常会降到10以下。对这么多页面使用此解决方案会不会很浪费内存?顺便说一下,这些片段将仅保留视图。谢谢!
mahkie 2012年

对于我的应用程序,此方法抛出:“ java.lang.IllegalStateException:片段已添加:”错误。
alicanbatur 2014年

非常感谢。确实有效。我也遇到过类似@chefgon的问题。
Prashant

@mahie以上解决方案(如果适用)是作为优化提供的。如果您预先知道需要支持的页面数*或在页面上设置了延迟加载机制*,则调整此设置可以使分页动画和交互的流畅性*受益。如果您的页面数量很少(3-4)*可以一次全部保持活动状态,则*在用户来回
翻页时

8

默认情况下,ViewPager在您滑动页面时会重新创建片段。为防止这种情况,您可以尝试以下两种方法之一:

1.在片段的onCreate()中,调用setRetainInstance(true)。

2.如果片段的数量是固定的并且相对较小,则在您的onCreate()中添加以下代码:

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(3);

如果我没记错的话,第二种选择更有希望。但我敦促您同时尝试两者,看看其中哪一个有效。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.