RecyclerView和ListView的区别
基础使用
ListView的适配器最终是继承BaseAdapter类重写方法,自定义ViewHolder和ConvertView一起完成复用优化工作。RecyclerView 同样也是需要继承重写 RecyclerView.Adapter 和 强制使用RecyclerView.ViewHolder ,以及使用到了LayoutManager。
所以这样看来,在RecyclerView当中与ListView不同之处在于:
- 对ViewHolder的编写进行了规范化。
- 另外,RecyclerView对 Item的复用 ,关于使用到ViewHolder对控件实例进行缓存的工作已经封装好,不需要像 ListView 那样调用 setTag 。
- 但是 RecyclerView 多出了 LayoutManager 的设置工作 。
布局效果
- ListView 做到了数据和视图的分离,布局排列是自身去管理。
- 而RecycleView 将视图和布局进一步分离, 因而出现了 LayoutManager,RecycleView 只负责管理视图的重复利用,然后将布局的管理全权交给了 LayoutManager, 不像 ListView 那样被限制在垂直滚动布局样式 。LayoutManager中制定了一套可扩展的布局排列接口,子类只要按照接口规范来实现,就能定制出各种不同排列方式的布局了。 LayoutManager 是一个抽象类,系统已经为我们提供了三个相关的实现类 LinearLayoutManager(线性布局效果)、GridLayoutManager(网格布局效果)、StaggeredGridLayoutManager(瀑布流布局效果)。 RecyclerView 默认就能支持 线性布局、网格布局、瀑布流布局 三种 ,通过配置和切换 LayoutManager 就可以获得不同的布局效果。所以如果想自定义出更多布局效果,可以继承重写自己的LayoutManager,通过LayoutManager还可以设置滚动方向、获取Item的位置等等。
事件监听
- ListView中提供了setOnItemClickListener、 setOnItemLongClickListener、setOnItemSelectedListener 等几个用于设置监听器,但是这些只能注册的是子项的点击事件,具体到子项里面的某个控件的点击事件的处理会比较麻烦,而且添加了 HeaderView 和 FooterView ,ListView 会把 HeaderView 和 FooterView 算入 position 内,代码有可能会报数组越界的错误 。
- 但是RecyclerView ,它并没有像 ListView 提供太多关于 Item 的某种事件监听,需要我们自己通过ViewHolder去给子项具体的View去注册点击事件,或者就是通过 addOnItemTouchListener 和GestureDetector手势判断来实现。
空数据的处理
- ListView 提供了 setEmptyView 这个 API 来让我们处理 Adapter 中数据为空的情况。
- 但是 RecyclerView 并没有提供这类 API ,所以需要自己处理。
HeaderView 和 FooterView
- 在 ListView 的设计中,addFooterView 、 addFooterView 可以添加HeaderView 和 FooterView 两种类型的视图 。
- RecyclerView 并没有提供这类 API。
局部刷新
更新了 ListView 的数据源后需要通过 Adapter 的 notifyDataSetChanged 方法来通知视图更新变化,调用简单,但它会重绘每个 Item,实际上却并不是每个 Item 都需要重绘。
而RecyclerView.Adapter 提供了 notifyItemChanged 用于更新单个 Item View 的刷新,我们可以省去自己写局部更新的工作。
动画效果
RecycleView 支持子项目层次的动画效果,是通过 ItemAnimation 接口(确定一下)实现的, 可以在 Adapter 中的数据发生变化的时候,通过调用 Adapter 的相关方法激活动画的产生,就是RecyclerView 在做局部刷新等等的时候有一个渐变的动画效果 。
嵌套滚动机制