PagerAdapter,FragmentPagerAdapter,FragmentStatePagerAdapter原理分析,notifyDataSetChanged如何更新Fragment?

本文深入探讨了PagerAdapter、FragmentPagerAdapter和FragmentStatePagerAdapter的原理,分析了在数据变化时如何正确更新Fragment。通过阅读源代码,作者指出在使用FragmentPagerAdapter时,仅调用notifyDataSetChanged()无法更新Fragment,需要重写getItemPosition()返回POSITION_NONE,同时在instantiateItem()中设置新数据。对于大量页面,FragmentStatePagerAdapter更合适,因为它在页面离开视线后会销毁Fragment以节省内存。
摘要由CSDN通过智能技术生成

水平显示Fragment分页在FragmentPagerAdapter和FragmentStatePagerAdapter使用如何选择?

  • FragmentPagerAdapater

FragmentPagerAdapter继承自PagerAdapter类,它将每个页面使用一个Fragment,只要用户能够返回到该页面,该Fragment就会一直保存在FragmentManager中,子类只需要实现getItem()和getCount()就可以实现一个可以工作的Adapter

优点:FragmentPagerAdapter最适合在有少量静态Fragment需要分页时使用,例如一组选项卡。用户访问的每个页面的Fragment都将保存在内存中,尽管其视图层次结构在不可见时可能会被破坏

缺点:这可能导致使用大量内存,因为Fragment实例可以保持任意数量的状态。

  • FragmentStatePagerAdapter

对于更大的页面集合,考虑使用FragmentStatePagerAdapter

FragmentStatePagerAdapter继承自PagerAdapter类,它将每个页面使用一个Fragment;该类也负责处理保存和恢复Fragment状态,子类只需要实现getItem()和getCount()就可以实现一个可以工作的Adapter。;

当有大量页面时,FragmentStatePagerAdapter更有用,工作方式更像列表视图。

优点:当页面对用户不可见时,其整个片段可能会被销毁,只保留该片段的保存状态。

缺点:FragmentPagerAdapter相比,这允许FragmentStatePagerAdapter保留与每个访问页面相关联的State,占用更少内存,但在页面之间切换时可能会产生更多开销。

1.多Fragment横向滑动常见问题

在一个Android应用中,我使用FragmentPagerAdapter来处理多Fragment页面的横向滑动,不过我碰到了一个问题,即当Fragment对应的数据集发生变化时,我希望能够通过调用adapter.notifyDataSetChanged()来触发Fragment页面使用新的数据调整或重新生成其内容,可是当我调用notifyDataSetChanged()后,发现什么都没有发生;

搜索之后发现不止我一个人碰到这个问题,大家给出的解决办法五花八门,有些确实解决了问题,但是我总感觉问题没搞清楚。于是我决定搞明白这个问题到底是怎么回事,以及正确的用法到底如何。要搞明白这个问题,仅仅阅读文档并不足够,还需要阅读相关几个类的相关方法的实现,搞懂其设计意图。下面就是通过阅读源代码搞明白的内容。

2.ViewPager

ViewPager如其名所述,是负责翻页的一个View;准备说是一个ViewGroup,包含多个View页,在手指横向滑动屏幕时,其负责对View进行切换;为了生成这些View页,需要提供一个PagerAdapter进行数据绑定以及生成最终的View页;

  • setAdapter()

ViewPager通过setAdapter来建立与PagerAdapter的联系;这个联系是双向的,一个方面,ViewPager会拥有

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值