适配器模式—在RecyclerView源码的应用

   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的布局。

你可能感兴趣的:(适配器模式—在RecyclerView源码的应用)