RecyCleView是什么?
ListView的局限
- 只有纵向列表的一种布局
- 没有支持动画API
- 接口设计和系统不一致
- 没有强制实现ViewHolder
RecyClerView的优势 - 默认支持Linear,grid,Staggered grid 三种布局
- 友好的ItemAnimator动画API
- 强制实现ViewHolder
- 解耦的架构设置
- 相比ListView更好的性能
View Holder是什么?
- View Holder和Item是什么关系?
一一对应的关系 - Holder View解决是什么问题?
解决类的复用 - VIew Holder 和ListView是什么关系?
ListVie的缓存机制
RecycleBin有两个缓存,一个是ActiveView活跃的View,ScrapView一个废弃移出屏幕的View,如果两个都没取到才创建一个View
image.png
Android滑动的时候会把每个View重新刷新一次,则用ActiveView缓存,ScrapView移出了屏幕,如果找到则重新绑定数据
image.png
RecycleView缓存原理
1.RecycleView Scap对应ListView 的ActiveView
Cache对应ListView的Scap
RecyClerView的性能优化策略
- 在onBindViewHolder里设置点击监听?
onBindViewHolder里设置点击监听器会导致重复创建对象
在View-ViewHolder-View.OnClick对应设置 - LinearLayoutManager.setLnitialPrefetchltemCount()
应用场景 - 用户滑动到横向滑动的item recyclerView的时候,由于需要创建更复杂的RecyClerView以及多个子View,可能会导致页面卡顿,
- 由于RenderThread的存在,RecyclerView会进行prefetch
LinearLayoutManager.setlnitialPrefetchitemCount(横向列表初次显示时可见的item个数) -
RecyclerView.setHasFixedSize()
image.png
场景:如果Adapter的数据变换不会导致 recycleview的大小变化——>RecyclerView.setHasFixedSize(true)才会有效果
多个RecyClerView公用RecycledViewPool
-
DiffUtil
-
局部更新方法 notifyItemXXX()不适用所有情况
-
notifyNodaSetChange会导致整个布局重绘,重新绑定所有ViewHolder,而且会失去可能的动画效果
-
diffutil适用于动态更新最小刷新
image.png
image.png -
getOldListSize()旧数集
-
getNewListSize()新数据集
-
areItemsTheSame()比较两个Item是不是用一个item
-
areContentsTheSame()同一个item的context是不是想用
-
getChangePayLoad()item变化了那些内容
image.png
在列表很大的时候异步计算diff
- 使用Thread/Hander将diffResult发送到主线程
- 使用RxJava将calculateDiff操作放到后台线程
- 使用Google提供的AsyncListDiffer(Executor)/ListAdapter
为什么使用ItemDecoration可以绘制分割线
image.pngimage.png
ItemDecorAtion(装饰显示的Item)还可以做啥?
某个item的高亮
分类
实现解耦
image.png
网友评论