RecycleView原理

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

image.png

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
image.png

为什么使用ItemDecoration可以绘制分割线

image.png

image.png

ItemDecorAtion(装饰显示的Item)还可以做啥?

某个item的高亮
分类
实现解耦


image.png

你可能感兴趣的:(RecycleView原理)