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片段的情况下提供更好的性能。