recyclerView adapter.notifyDataSetChanged()分析

① 
mAdapter.notifyDataSetChanged();
跟进源码,发现是通过观察者模式进行分发的
RecyclerView.Adapter:
public final void notifyDataSetChanged() {
   
            this.mObservable.notifyChanged();
        }
②
 找到注册观察者的地方:应该就是设置设配器的地方
 RecycerView.setAdapter(adapter);
 跟进源码->
 public void setAdapter(@Nullable RecyclerView.Adapter adapter) {
   
        ...
        this.setAdapterInternal(adapter, false, true);
        ...
 }
 private void setAdapterInternal(@Nullable RecyclerView.Adapter adapter, boolean compatibleWithPrevious, boolean removeAndRecycleViews) {
   
		// 上一个 mAdapter的观察者取消注册
        if (this.mAdapter != null) {
   
            this.mAdapter.unregisterAdapterDataObserver(this.mObserver);
            this.mAdapter.onDetachedFromRecyclerView(this);
        }
		...
		// 更新 设配器
        this.mAdapter = adapter;
        if (adapter != null) {
   
        	// 当前adapter 注册观察者
            adapter.registerAdapterDataObserver(this.mObserver);
            adapter.onAttachedToRecyclerView(this);
        }
        ...
    }
③
 可以看到观察者对象是 RecyclerView.this.mObserver
   mObserver的初始化是在RecyclerView构造器里面
   public RecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
   
        super(context, attrs, defStyle);
        this.mObserver = new RecyclerView.RecyclerViewDataObserver();
        ...
      }

// 观察者 与 设配器刷新方法一一对应
private class RecyclerViewDataObserver extends RecyclerView.AdapterDataObserver {
   
        RecyclerViewDataObserver() {
   
        }
        /**
        * 对应 mAdapter.notifyDataSetChanged();
        */
        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();
            }
        }

		/**
        * 对应 mAdapter.onItemRangeChanged();
        */
        public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
   
            RecyclerView.this.assertNotInLayoutOrScroll((String)null);
            if (RecyclerView.this.mAdapterHelper.onItemRangeChanged(positionStart, itemCount, payload)) {
   
                this.triggerUpdateProcessor();
            }
        }
		/**
        * 对应 mAdapter.onItemRangeInserted();
        */
        public void onItemRangeInserted(int positionStart, int itemCount) {
   
            RecyclerView.this.assertNotInLayoutOrScroll((String)null);
            if (RecyclerView.this.mAdapterHelper.onItemRangeInserted(positionStart, itemCount)) {
   
                this.triggerUpdateProcessor();
            }
        }
		/**
        * 对应 mAdapter.onItemRangeRemoved();
        */
        public void onItemRangeRemoved(int positionStart, int itemCount) {
   
            RecyclerView.this.assertNotInLayoutOrScroll((String)null);
            if (RecyclerView.this.mAdapterHelper.onItemRangeRemoved(positionStart, itemCount)) {
   
                this.triggerUpdateProcessor()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值