一 FragmentPagerAdapter 和 FragmentStatePagerAdapter 解析
a 第一次添加界面的时候,由于FragmentManager中没有这个Fragment,因此需要通过自定义的FragmentPagerAdapter获取,然后调用add方法,所走的生命周期为onAttach() -> onResume()。
b 移除界面时,使用的是detach方法,接触过Fragment的人都知道,这时候仅仅是Fragment的界面被从View树上移除了而已,它的实例仍然被保存在FragmentManager当中,所走的生命周期为onPause() -> onDestroyView()。
c 重新添加界面时,由于此时去FragmentManager中能找到那个Fragment,所以调用的是attach方法,也就是上面代码中的第(2)步,所走的生命周期为onCreateView() -> onResume(),并且不需要再从自定义的FragmentPagerAdapter中获取Fragment。
e FragmentStatePagerAdapter在移除页面的时候,调用的是remove方法,也就是说,FragmentManager中不再有这个Fragment的实例,所走的生命周期为onPause() -> onDetach()。
f 无论是添加页面还是重新添加页面,它是通过add方法,并且每次都会通过自定义的FragmentStatePagerAdapter子类的getItem方法来获取Fragment,所以它们内部的Fragment所走生命周期相同,都是从onAttach() -> onResume()。
g 对于ViewPager当前界面中所对应的Fragment,是通过一个mFragments列表来管理的,由于此时没有FragmentManager来帮我们实现Fragment集合的状态的保存和恢复,所以就需要我们自己实现onSave/onRestore方法来进行状态的保存和恢复。
总结
a FragmentPagerAdapter和FragmentStatePagerAdapter最大的区别就在于前者会把所有Fragment的示例都缓存在内存当中,而后者仅仅保存了ViewPager当前存在的页面所对应的Fragment,当页面被移除之后,这个Fragment的示例它也就不再保存了。
b 当然,在我们前面的例子中,虽然使用了FragmentStatePagerAdapter,但是由于我们在DemoActivity中用一个列表保存了所有的Fragment实例,因此它没有被回收,如果希望让页面被移除的时候,其对应的Fragment实例也被回收,那么我们的FragmentStatePagerAdapter的子类应
二 RecyclerView 对比ListView
1 为什么要使用RecyclerView
RecyclerView诞生的目的就是为了替代ListView,我们先总结一下在使用ListView过程当中所遇到的问题:
1 复用Item需要编写很多的代码
2 在使用ListView的时候,有经验的程序员一定会告诉你在getView中要这么写,如果忘了,那么会产生很严重的性能问题。
if(convertView==null){//通过LayoutInflator生成convertView,并产生一个ViewHolder,通过setTag关联起来. }else{//通过getTag获取 ViewHolder,进行更新操作.}
3 焦点冲突问题
当Item有焦点时,Item的子控件就无法获取到焦点;而如果子控件抢夺了焦点,那么Item的点击事件又不能响应,这个相信大家都遇到过。
4 重复的API
ListView中提供了很多的API,但是这些API又和View的一些API重复了,例如我们可以给ListView设置setOnItemClickListener,也可以在getView中给某个View设置setOnClickListener,这就让人很疑惑,到底应当选用哪个。
5 动画
当我们需要在ListView中进行添加、删除、移动等操作的时候,如果希望加上动画,那么是很困难的,根本原因是我们是通过Adapter通知ListView进行更新,然而ListView根本就没法确定到底是哪些View发生了变化。
6 更加复杂的布局需求
ListView在布局是规整的列表的时候能满足大多数人的使用,然而如果想要实现像瀑布流这种复杂的布局,并且保证View能够复用,那么需要编写很多的代码。
2从如果之前有了解过RecyclerView的基本用法,那么你会发现,对于上述这些问题,它都给出了自己的解决方案:
1强制使用开发者使用ViewHolder,提供了onCreateViewHolder和onBindViewHolder这两个方法,把创建View和绑定View的操作分离开。
2 把焦点交给系统处理。
3 去掉了onItemClickListener,以及一些重复的API。
4 在Adapter中增加了notifyItemChanged()等方法,让我们可以指定变化的类型和范围,并且提供了setItemAnimator()方法,让开发者能够方便地定义添加、删除、移动的动画。
5 把布局的工作抽象出来,放到了LayoutManager当中,并预制了瀑布流布局。
3 RecyclerView架构
整个RecyclerView体系包含三大组件:
LayoutManager:position the view
ItemAnimator:animate the view
Adapter:provide the view
3.1LayoutManager
LayoutManager需要负责以下几部分的工作:
3.1.1 Position 它负责View的摆放,可以是线性、宫格、瀑布流式或者任意类型,而RecyclerView不知道也不关心这些,这是LayoutManager的职责。
3.1.2 Scroll 对于滚动事件的处理,RecyclerView负责接收事件,但是最终还是由LayoutManager进行处理滚动后的逻辑,因为只有它在知道View具体摆放的位置。
3.1.3 Focus traversal 当焦点转移导致需要一个新的Item出现在可视区域中时,也是由LayoutManager处理的。
3.2Adapter
Adapter需要负责以下几部分的工作:
3.2.1 创建View和ViewHolder,后者作为整个复用机制的跟踪单元。
3.2.2 把具体位置的Item和ViewHolder进行绑定,并存储相关的信息。
3.2.3 通知RecyclerView数据变化,支持局部的更新,在提高效率的同时也有效地支持了动画。
3.2.4 Item点击事件的处理。
3.2.5 多类型布局的支持。
网友评论