Android 理解片段活动生命周期

Android 理解片段活动生命周期,android,android-fragments,android-lifecycle,Android,Android Fragments,Android Lifecycle,我创建了一个android应用程序,它使用ViewPager浏览三个片段(三个片段中的每一个都包含一个gridview) 我最近开始学习片段,并假设在片段中创建了GridView之后,每个片段都会存储在内存中,不再需要再次加载 最近我注意到,当我从左边的片段滑动到中间片段,然后再滑动到右边片段时,最左边的片段必须用我的适配器再次填充它的gridview 我只是想知道为什么当我从最左边的片段导航到最右边的片段时会发生这种情况,而不是在并排的片段之间导航时。它是否只在内存中保留最新的片段并杀死另一个

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

我最近开始学习片段,并假设在片段中创建了GridView之后,每个片段都会存储在内存中,不再需要再次加载

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

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


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

这是
FragmentPagerAdapter
FragmentPagerStateAdapter
工作的本质。从谷歌网站:

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
关闭了视图,必须重新构建它

编辑:如果您需要在内存中保留所有三个片段
视图
,以加快速度,那么您必须创建自己的
PagerAdapter
,将视图存储在某种
集合
中的
实例化项(ViewGroup,int)

或者,如果您使用的是Google的示例逐字记录,那么您可能正在执行以下操作:

@Override
public Fragment getItem(int position) {
  return ArrayListFragment.newInstance(position);
}

在这种情况下,每次ViewPager请求一个片段时,您都在重建一个新片段。

ViewPager在内存中保留一定数量的屏幕外选项卡(
片段
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

希望这有帮助

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

啊!忘了这个方法。这是最好的解决方案,完美。谢谢你的帮助@Eric!我们中的一些人只是在片段集合的请求位置返回一个片段,返回this.fragments.get(position);它不会显式创建新片段,但如果不更改setOffscreenPageLimit(),它将重新创建片段视图。