我创建了一个Android应用程序,它使用ViewPager来浏览三个片段(三个片段中的每一个都包含一个gridview)。
我最近开始学习片段,并假设在我的网格视图在片段中创建后,每个片段都会在内存中,而不必再次加载。
最近我注意到,当我从左侧片段滑动到中间片段,然后到右侧片段时,最左侧片段必须再次使用我的适配器填充其网格视图。
我只是想知道为什么当我从最左边的片段导航到最右边的片段时会发生这种情况,而不是当我在并排片段之间导航时。它是否只将最新的片段保留在内存中并杀死其他片段?或者是否有其他原因导致应用程序无法将所有三个片段保留在内存中?当我在片段之间快速导航时,我的应用程序变得有点滞后和缓慢,所以如果可能的话,只需要一次绘制每个gridview就好了。
我在onCreate()中填充我的arraylist(用于填充适配器),然后使用onActivityCreated中的适配器填充我的gridview(Bundle savedInstanceState)
答案 0 :(得分:6)
ViewPager
在内存中保留了一定数量的屏幕外标签(Fragment
s)。我相信所有设备的默认值为1.因此,当您滚动到最右侧时,只有左侧的那个将保留在内存中。
如果您希望ViewPager
保留内存中的所有标签(小心 - 这可能在设备或其他正在运行的应用程序上很难),您可以设置要保留在内存中的屏幕外标签数量。为此,请在ViewPager
对象上使用ViewPager
ViewPager pager = (ViewPager) findViewById(R.id.pager); // Your pager's ID
pager.setOffscreenPageLimit(2); // Will retain 2 off-screen tabs + your selected tab
方法。
示例:
{{1}}
希望这有帮助!
答案 1 :(得分:2)
FragmentPagerAdapter
和FragmentPagerStateAdapter
的工作原理。来自Google的网站:
The fragment of each page the user visits will be kept in memory, though its view hierarchy may be destroyed when not visible.
意思是,您的GridView
正在重新填充,因为您的ViewPager
已杀死视图并且必须重建它。
编辑:如果您需要将所有三个片段Views
保留在内存中以加快速度,那么您必须创建自己的PagerAdapter
,将instantiateItem(ViewGroup, int)
内的视图存储在某种Collection
。
或者,如果您逐字使用Google的示例,那么您可能会这样做:
@Override
public Fragment getItem(int position) {
return ArrayListFragment.newInstance(position);
}
在这种情况下,每次ViewPager请求时,您都会重建一个新片段。
答案 2 :(得分:1)
默认情况下,ViewPager
处于空闲状态,左边是一个片段,另一个是当前页面右边的片段。您可以使用ViewPager.setOffscreenPageLimit()
更改此行为。见docs