水平显示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会拥有