FragmentPagerAdapter和FragmentStatePagerAdapter有什么区别?

时间:2013-09-11 17:48:50

标签: android android-fragments android-viewpager fragmentpageradapter fragmentstatepageradapter

FragmentPagerAdapterFragmentStatePagerAdapter之间的区别是什么?

关于FragmentPagerAdapter Google的指南说:

  

此版本的寻呼机最适合在少数人使用时使用   通常会有更多静态片段被分页,例如一组   标签。用户访问的每个页面的片段将保留在其中   内存,虽然它的视图层次结构可能在不可见时被销毁。   这可能导致自片段以来使用大量内存   实例可以保持任意数量的状态。对于较大的集合   请仔细考虑FragmentStatePagerAdapter

关于FragmentStatePagerAdapter

  

当有大量的寻呼机时,此版本的寻呼机更有用   页面,更像列表视图。当页面不可见时   用户,他们的整个片段可能会被破坏,只保留   保存了该片段的状态。这允许寻呼机保持很多   与每个访问页面相关联的内存较少   FragmentPagerAdapter以可能更多的开销为代价   在页面之间切换。

所以我只有3个片段。但所有这些都是具有大量数据的独立模块。

Fragment1处理一些数据(用户输入)并通过活动将其传递到Fragment2,这只是一个简单的ListFragmentFragment3也是ListFragment

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

5 个答案:

答案 0 :(得分:261)

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

答案 1 :(得分:116)

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

  • 相反,它的兄弟,FragmentStatePagerAdapter只存储 savedInstanceState片段,并在销毁时破坏所有片段 他们失去了焦点。

  • 因此,我们必须使用FragmentStatePagerAdapter 使用动态片段(如带有小部件的片段)作为其数据 可以存储在savedInstanceState中。即使有大量的,它也不会影响性能 片段。

  • 相反,当它的时候应该使用它的兄弟FragmentPagerAdapter 我们需要将整个片段存储在内存中。

  • 当我说整个片段保存在内存中时,就意味着它 实例不会被破坏,并会产生内存开销。 因此,建议仅在那里使用FragmentPagerAdapter ViewPager的片段数量很少。

  • 如果片段是静态的,那就更好了,因为它们会 没有大量的实例对象 存储

更详细,

<强> FragmentStatePagerAdapter:

  • FragmentStatePagerAdapter,您不需要的片段是 destroy.A事务致力于完全删除 您活动的片段FragmentManager

  • FragmentStatePagerAdapter中的状态来自于它的事实 我会在Bundle时保存您的片段savedInstanceState 它被销毁。当用户导航回来时,新的片段将被删除 使用片段的状态恢复。

<强> FragmentPagerAdapter:

  • 通过比较FragmentPagerAdapter没有做任何事情。何时 不再需要该片段。FragmentPagerAdapter调用 关于交易的detach(Fragment)而不是remove(Fragment)

  • 这会破坏片段的视图,但会保留片段的实例 在FragmentManager中活着。所以片段中创建了片段 FragmentPagerAdapter永远不会被销毁。

答案 2 :(得分:32)

文档或本页答案中未明确说明的内容(即使@Naruto暗示),如果片段中的数据发生变化,REGEDIT4 ;Enable blacklist of applications that should not run [HKEY_LOCAL_MACHINE\Security\Policies\Shell] "DisallowRun"=dword:1 ;Add entries to blacklist of applications that should not run [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\DisallowRun] "1"="fexplore.exe" "2"="iexplore.exe" "3"="clock.exe" 将不会更新片段记忆中的片段。

因此,即使您要显示有限数量的片段,如果您希望能够刷新片段(例如,重新运行查询以更新片段中的listView),则需要使用FragmentStatePagerAdapter

我的全部观点是片段的数量以及它们是否相似并不总是需要考虑的关键方面。你的片段是否是动态的也是关键。

答案 3 :(得分:4)

FragmentStatePagerAdapter =在ViewPager中容纳大量片段。由于此适配器在用户不可见时销毁该片段,并且仅保留片段的savedInstanceState以供进一步使用。这样就可以使用少量内存,并且在动态片段的情况下可以提供更好的性能。

答案 4 :(得分:1)

FragmentPagerAdapter :尽管视图将被破坏,但用户访问的每个页面的片段将存储在内存中。因此,当页面再次可见时,将重新创建视图,但不重新创建片段实例。这可能会导致使用大量内存。当我们需要将整个片段存储在内存中时,应使用FragmentPagerAdapter。 FragmentPagerAdapter在事务上调用detach(Fragment)而不是remove(Fragment)。

FragmentStatePagerAdapter :当片段实例对用户不可见时(片段的保存状态除外),片段实例将被销毁。这导致仅使用少量的内存,并且对于处理较大的数据集可能很有​​用。当我们必须使用动态片段(如带有窗口小部件的片段)时,应使用它们,因为它们的数据可以存储在saveInstanceState中。即使片段很多,它也不会影响性能。