RecyclerView 与 ListView 功能对比
对比项 | AbsListView | RecyclerView |
---|---|---|
定向刷新 | 不支持 | 支持 |
局部刷新 | 不支持 | 支持 |
刷新动画 | 不支持 | 支持 |
Item点击 | 支持 | 不支持 |
分隔线 | 样式单一 | 自定义样式 |
布局方式 | 列表/网格 | 自定义样式 |
头尾添加 | 支持 | 不支持 |
Adapter
- Adapter:1.创建View 2.绑定数据
- item view 和 view holder 一对一对应:
- RecyclerView将ListView中getView()的功能拆分成了onCreateViewHolder()和onBindViewHolder()两个方法。
ListView实现局部刷新方法
通过ListView的getChildAt()来获得需要更新的View,然后通过getTag()获得ViewHolder,从而实现更新。
RecyclerView
组成:
RecyclerView.LayoutManager 负责Item视图的布局的显示管理
RecyclerView.ItemDecoration 给每一项Item视图添加子View,例如可以进行画分隔线之类
RecyclerView.ItemAnimator 负责处理数据添加或者删除时候的动画效果
RecyclerView.Adapter 为每一项Item创建视图
RecyclerView.ViewHolder 承载Item视图的子布局
Recycler缓存机制
使用:
通过onViewAttachedToWindow方法统计item被查看次数。
优化:
- 点击事件设置在onCreateViewHolder方法里,避免重复频繁调用。
- 嵌套子View是横向RecyclerView时,可以使用setInitialPrefetchItemCount方法设置显示的item数量,减少卡顿。
- 数据变化,ItemView大小不会变化情况下,可以把setHasFixedSize设置为true。这样会直接layoutChildren,否则requestLayout。
- 共用RecycledViewPool,两行代码搞定,不同RecyclerView有重复的ItemView会被复用。
- DiffUtil适用于整个列表刷新,但是有部分数据相同。列表数据比较大,比较耗时,可以用AsyncListDiffer(Executor)/ListAdapter