为了账号安全,请及时绑定邮箱和手机立即绑定

FragmentPagerAdapter和FragmentStatePagerAdapter

FragmentPagerAdapter和FragmentStatePagerAdapter

qq_遁去的一_1 2019-07-06 12:43:17
FragmentPagerAdapter和FragmentStatePagerAdapter有什么区别?.之间的区别是什么?FragmentPagerAdapter和FragmentStatePagerAdapter?关于FragmentPagerAdapter谷歌的指南说:当有几个典型的静态片段需要分页时,这个版本的寻呼机最适合使用,例如一组制表符。用户访问的每个页面的片段都将保存在内存中,尽管当其视图层次结构不可见时可能会被销毁。这可能导致使用大量内存,因为片段实例可以保持任意数量的状态。对于较大的页面集,请考虑FragmentStatePagerAdapter.还有关于FragmentStatePagerAdapter:当有大量页面时,此版本的寻呼机更有用,更像是列表视图。当页面对用户不可见时,可能会销毁其整个片段,只保留该片段的保存状态。这使得寻呼机能够保持与每个访问页面相关联的内存比FragmentPagerAdapter在页面之间切换时,代价是潜在的更多开销。所以我只有三个碎片。但它们都是单独的模块,具有大量的数据。Fragment1处理一些数据(用户输入这些数据)并通过活动传递给Fragment2,这只是一个简单的ListFragment. Fragment3也是ListFragment.所以我的问题是:我应该使用哪个适配器?FragmentPagerAdapter或FragmentStatePagerAdapter?
查看完整描述

3 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

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


查看完整回答
反对 回复 2019-07-06
?
忽然笑

TA贡献1806条经验 获得超5个赞

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

  • 相反,它的兄弟姐妹,FragmentStatePagerAdapter只存储碎片的保存状态,并在所有碎片失去焦点时销毁它们。

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

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

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

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

为了更详细,

FragmentStatePagerAdapter:

  • 带着FragmentStatePagerAdapter,您不需要的片段就被销毁了。一个事务被提交到从您的活动的片段中完全删除该片段。FragmentManager.

  • FragmentStatePagerAdapter是因为它会拯救你的碎片Bundle从…savedInstanceState当用户向后导航时,将使用片段的状态恢复新的片段。

FragmentPagerAdapter:

  • 通过比较FragmentPagerAdapter什么都不做,当碎片不再需要的时候。FragmentPagerAdapter打电话detach(Fragment)关于事务而不是remove(Fragment).

  • 此破坏是碎片的视图,但将碎片的实例保留在FragmentManager因此,在FragmentPagerAdapter永远不会被摧毁。


查看完整回答
反对 回复 2019-07-06
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

在文档或本页的答复中没有明确说明的是:FragmentPagerAdapter如果片段中的数据更改,则不会更新片段,因为它将片段保存在内存中。

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

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


查看完整回答
反对 回复 2019-07-06
  • 3 回答
  • 0 关注
  • 1357 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信