适配器模式—在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的布局。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容