FragmentPagerAdapter和FragmentStatePagerAdapter之间的区别
FragmentPagerAdapter和FragmentStatePagerAdapter什么区别?
关于FragmentPagerAdapter Google的指南说:
这个版本的寻呼机最适合用于有less量通常需要寻呼的静态片段,比如一组选项卡。 用户访问的每个页面的片段将保存在内存中,尽pipe其视图层次可能在不可见时被破坏。 这可能会导致使用大量的内存,因为片段实例可以保持任意数量的状态。 对于更大的页面集,请考虑FragmentStatePagerAdapter。
而关于FragmentStatePagerAdapter :
当有大量的页面时,这个版本的寻呼机更加有用,更像是一个列表视图。 当页面对用户不可见时,它们的整个片段可能被破坏,只保留该片段的保存状态。 与FragmentPagerAdapter相比,这允许寻呼机保持与每个被访问页面相关的更less的存储器,代价是在页面之间切换时可能会有更多的开销。
所以我只有3个片段。 但是它们都是一个单独的模块,具有大量的数据。 Fragment1处理一些数据(用户input),并通过活动传递给Fragment2 ,这只是简单的ListFragment 。 Fragment3也是ListFragment 。
所以我的问题是 :我应该使用哪个适配器? FragmentPagerAdapter或FragmentStatePagerAdapter ?
我将非常感谢您的帮助。 亚历克斯。 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片段的情况下提供更好的性能。