setAdapterInternal
方法主要作用是将传进来的 adapter
保存到 mAdapter
变量。之后调用了 requestLayout
方法。
public void requestLayout() {
if (this.mEatRequestLayout == 0 && !this.mLayoutFrozen) {
super.requestLayout();
} else {
this.mLayoutRequestEaten = true;
}
}
requestLayout
方法又调用了父类的 requestLayout
方法,最终调用了 View
的 requestLayout
方法。
public void requestLayout() {
…
if (mParent != null && !mParent.isLayoutRequested()) {
mParent.requestLayout();
}
…
}
上面的 mParent
的真正实例为 ViewRootImpl
,也就是说执行了 ViewRootImpl
的 requestLayout
方法。
public void requestLayout() {
if (!mHandlingLayoutInLayoutRequest) {
checkThread();
mLayoutRequested = true;
scheduleTraversals();
}
}
scheduleTraversals
方法被执行,意味着后续开始执行 RecyclerView
的 onMeasure
、onLayout
、onDraw
方法,之后RecyclerView
中子视图就展示出来了。
这里我们将 onLayout
方法单拎出来进行分析,因为 RecyclerView
之所以能适配多种滚动布局,主要是 onLayout
方法发挥作用。
protected void onLayout(boolean changed, int l, int t, int r, int b) {
…
this.dispatchLayout();
…
}
onLayout
方法接着调用了 dispatchLayout
方法。
void dispatchLayout() {
…
mState.mIsMeasuring = false;
if (mState.mLayoutStep == State.STEP_START) {
dispatchLayoutStep1();
mLayout.setExactMeasureSpecsFrom(this);
dispatchLayoutStep2();
}
…
dis