public void setAdapter(@Nullable RecyclerView.Adapter adapter) {
this.setLayoutFrozen(false);
//调用了setAdapterInternal方法
this.setAdapterInternal(adapter, false, true);
this.processDataSetCompletelyChanged(false);
this.requestLayout();
}
private void setAdapterInternal(@Nullable RecyclerView.Adapter adapter, boolean compatibleWithPrevious, boolean removeAndRecycleViews) {
//代码省略
if (adapter != null) {
//注册观察者
adapter.registerAdapterDataObserver(this.mObserver);
adapter.onAttachedToRecyclerView(this);
}
//代码省略
}
//这个观察者的实现类是RecyclerView的内部类RecyclerViewDataObserver
private class RecyclerViewDataObserver extends RecyclerView.AdapterDataObserver {
public void onChanged() {
RecyclerView.this.assertNotInLayoutOrScroll((String)null);
RecyclerView.this.mState.mStructureChanged = true;
RecyclerView.this.processDataSetCompletelyChanged(true);
if (!RecyclerView.this.mAdapterHelper.hasPendingUpdates()) {
RecyclerView.this.requestLayout();
}
}
}
在数据集发生变化后调用了Adapter的notifyDataSetChanged的onChanged函数后,就会调用观察者的onChanged函数,然后调用requestLayout方法重新布局。
在方法调用链中,requestLayout()→onLayout()→dispatchLayout()→onLayoutChildren()。
在LinearLayoutManager中,重写了onLayoutChildren(),在onLayoutChildren函数中会调用fill函数,在fill函数中会调用layoutChunk函数。
//在layoutChunk函数中获取了ItemView并且进行了布局
void layoutChunk(Recycler recycler, State state, LinearLayoutManager.LayoutState layoutState, LinearLayoutManager.LayoutChunkResult result) {
//在Recycler中获取Item View
View view = layoutState.next(recycler);
//代码省略
}
在Recycler中获取ItemView步骤如下,
1.从mChangedScrap中获取ViewHolder缓存,
2.从mAttachedScrap中获取ViewHolder缓存
3.没有ViewHolder函数,会调用onCreateViewHolder函数,
4.绑定数据,则调用Adapter的onBindViewHolder
总结: Recyclew通过适配器模式和观察者模式,进行数据绑定,
Adapter封装了ViewHolder的创建和绑定,而将布局工作交给了LayoutManager,在LayoutManager中进行ItemView的布局。