4

我创建了一个 android 应用程序,它使用 ViewPager 来浏览三个片段(三个片段中的每一个都包含一个 gridview)。

我最近开始学习片段,并假设在我的网格视图在它们的片段中创建之后,每个片段都将在内存中并且永远不必再次加载。

最近我注意到,当我从左边的片段滑到中间的片段,然后到右边的片段时,最左边的片段必须用我的适配器再次填充它的网格视图。

我只是想知道为什么当我从最左边的片段导航到最右边的片段时会发生这种情况,而不是当我在并排的片段之间导航时会发生这种情况。它是否只将最近的片段保留在内存中并杀死另一个片段?还是有其他原因导致应用程序不会将所有三个片段都保存在内存中?当我在片段之间快速导航时,我的应用程序会变得有点迟钝和缓慢,所以如果可能的话,最好只绘制一次每个 gridview。

我在 onCreate() 中填充我的arraylist(用于填充适配器),然后在 onActivityCreated(Bundle savedInstanceState) 中用适配器填充我的gridview

4

3 回答 3

6

在内存中ViewPager保留了一定数量的屏幕外标签(Fragment当然是 s)。我相信所有设备的默认值是 1。因此,当您滚动到最右边时,只有它左边的那个会被保存在内存中。

如果您希望ViewPager将所有选项卡保留在内存中(小心——这在设备或其他正在运行的应用程序上可能很难),您可以设置在内存中保留多少个屏幕外选项卡。为此,请使用对象上的setOffscreenPageLimit方法。ViewPagerViewPager

例子:

ViewPager pager = (ViewPager) findViewById(R.id.pager); // Your pager's ID
pager.setOffscreenPageLimit(2); // Will retain 2 off-screen tabs + your selected tab

希望这可以帮助!

于 2012-07-16T20:38:57.923 回答
2

这是 aFragmentPagerAdapterFragmentPagerStateAdapter工作方式的本质。从谷歌的网站:

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 请求一个片段时,您都在重建一个新片段。

于 2012-07-16T20:37:59.450 回答
1

默认情况下ViewPager,当前页面左侧一个片段,右侧一个片段保持空闲状态。您可以使用 更改此行为ViewPager.setOffscreenPageLimit()。查看文档

于 2012-07-16T20:40:16.147 回答