FragmentPagerAdapter和FragmentStatePagerAdapter之间的区别

FragmentPagerAdapterFragmentStatePagerAdapter什么区别?

关于FragmentPagerAdapter Google的指南说:

这个版本的寻呼机最适合用于有less量通常需要寻呼的静态片段,比如一组选项卡。 用户访问的每个页面的片段将保存在内存中,尽pipe其视图层次可能在不可见时被破坏。 这可能会导致使用大量的内存,因为片段实例可以保持任意数量的状态。 对于更大的页面集,请考虑FragmentStatePagerAdapter。

而关于FragmentStatePagerAdapter

当有大量的页面时,这个版本的寻呼机更加有用,更像是一个列表视图。 当页面对用户不可见时,它们的整个片段可能被破坏,只保留该片段的保存状态。 与FragmentPagerAdapter相比,这允许寻呼机保持与每个被访问页面相关的更less的存储器,代价是在页面之间切换时可能会有更多的开销。

所以我只有3个片段。 但是它们都是一个单独的模块,具有大量的数据。 Fragment1处理一些数据(用户input),并通过活动传递给Fragment2 ,这只是简单的ListFragmentFragment3也是ListFragment

所以我的问题是 :我应该使用哪个适配器? FragmentPagerAdapterFragmentStatePagerAdapter

我将非常感谢您的帮助。 亚历克斯。 PS对不起,我的英文:)

就像文档说的那样,这样想。 如果您要像书本阅读器那样执行应用程序,则不会希望一次将所有片段加载到内存中。 您想要在用户阅读时加载和销毁Fragments 。 在这种情况下,您将使用FragmentStatePagerAdapter 。 如果你只是显示3个“标签”,不包含大量的重要数据(比如Bitmaps ),那么FragmentPagerAdapter可能适合你。 另外,请记住,默认情况下, ViewPager会将3个片段加载到内存中。 您提到的第一个Adapter可能会销毁View层次结构并在需要时重新加载它,第二个Adapter只保存Fragment的状态并完全销毁它,如果用户返回到该页面,则会检索状态。

  • FragmentPagerAdapter将整个片段存储在内存中,如果在ViewPager中使用了大量片段,则会增加内存开销。

  • 与其兄弟相反, FragmentStatePagerAdapter仅存储片段的savedInstanceState,并在失去焦点时销毁所有片段。

  • 因此,当我们必须使用dynamic片段(比如带有小部件的片段)时,应该使用FragmentStatePagerAdapter ,因为它们的数据可以存储在savedInstanceState 。即使存在大量的片段,也不会影响性能。

  • 当我们需要将整个片段存储在内存中时,应该使用它的同胞FragmentPagerAdapter

  • 当我说整个片段被保存在内存中时,意味着它的实例不会被销毁,并且会造成内存开销。 因此,build议仅在ViewPager的片段数量ViewPager时才使用FragmentPagerAdapter

  • 如果片段是静态的,它将会更好,因为它们不会有大量的实例将被存储的对象。

更详细地说,

FragmentStatePagerAdapter:

  • FragmentStatePagerAdapter ,你不需要的片段被销毁。一个事务被承诺从你的活动的FragmentManager完全删除FragmentManager

  • FragmentStatePagerAdapter的状态来自于这样一个事实,即当它被销毁时,它会从savedInstanceState保存你的分片的Bundle 。当用户导航回来时,新的分片将使用分片的状态被恢复。

FragmentPagerAdapter:

  • 通过比较, FragmentPagerAdapter不做任何事情。当片段不再需要时。 FragmentPagerAdapter调用detach(Fragment)事务而不是remove(Fragment)

  • 这个销毁的片段的视图,但片段的实例留在FragmentManager因此,在FragmentPagerAdapter中创build的FragmentPagerAdapter永远不会被销毁。

在文档中或在本页面的答案中没有明确指出的东西(即使是由@Naruto暗示),如果片段中的数据更改, FragmentPagerAdapter将不会更新片段,因为它将片段保留在内存中。

所以,即使你的碎片数量有限,如果你想刷新你的碎片(比如说你重新运行查询来更新Fragment中的listView),你需要使用FragmentStatePagerAdapter。

我的整个观点是,碎片的数量以及它们是否相似并不总是需要考虑的关键因素。 你的片段是否dynamic也是关键。

FragmentPagerAdapter存储从适配器获取的以前的数据,而FragmentStatePagerAdapter在每次执行时都从适配器获取新值。

FragmentStatePagerAdapter =在ViewPager中容纳大量的片段。 由于此适配器在对用户不可见时破坏片段,并且只保留片段的savedInstanceState以供进一步使用。 这样使用less量的内存,并在dynamic片段的情况下提供更好的性能。