RecyclerView的布局流程

官方简介:A flexible view for providing a limited window into a large data set.
一种用于在有限的窗口展示大量数据集的灵活的视图;

RecyclerView在设计方面上非常的灵活,不同的部分承担着不同的职责。其中Adapter负责提供数据,包括创建ViewHolder和为ViewHolder绑定数据,LayoutManager负责ItemView的测量和布局,ItemAnimator负责每个ItemView的动画,ItemDecoration负责每个ItemView的间隙,Recycler负责ItemView的回收和复用。这种插拔式的架构使得RecyclerView变得非常的灵活,开发者可以根据自身的需求来定义不同的部分。

RecyclerView的布局流程

dispatchLayoutStep1

  1. Adapter的更新;
  2. 决定该启动哪种动画;
  3. 保存当前View的信息(getLeft(), getRight(), getTop(), getBottom()等);
  4. 如果有必要,先跑一次布局并将信息保存下来。

dispatchLayoutStep2

真正对子View做布局的地方。

  1. 计算锚点,以锚点开始填充RecyclerView(就是执行fill方法)。
  2. 执行fill方法,判断RecyclerView是否还有空间,如果有,执行layoutChunk方法,直至填充满。
  3. layoutChunk方法中,寻找到当前要添加的子view,add到RecyclerView中。
  4. 对子view进行measure和layout。

dispatchLayoutStep3

为动画保存View的相关信息; 触发动画; 相应的清理工作。

其实dispatchLayoutStep3()就是做了一些收尾工作,将一些变量重置,处理下动画。

mState.mLayoutStep

  • 初始化为STEP_START
  • 执行完dispatchLayoutStep1后,mState.mLayoutStep = State.STEP_LAYOUT;
  • 执行完dispatchLayoutStep2后,mState.mLayoutStep = State.STEP_ANIMATIONS;
  • 执行完dispatchLayoutStep3后,mState.mLayoutStep = State.STEP_START;

RecyclerView 源码分析(一) - RecyclerView的三大流程
RecyclerView剖析
深入分析RecyclerView源码——布局流程(上)
深入了解RecyclerView预布局状态(preLayout)