①
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) {
if ( this . mAdapter != null) {
this . mAdapter. unregisterAdapterDataObserver ( this . mObserver) ;
this . mAdapter. onDetachedFromRecyclerView ( this ) ;
}
. . .
this . mAdapter = adapter;
if ( adapter != null) {
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 ( ) {
}
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 ( ) ;
}
}
public void onItemRangeChanged ( int positionStart, int itemCount, Object payload) {
RecyclerView. this . assertNotInLayoutOrScroll ( ( String) null) ;
if ( RecyclerView. this . mAdapterHelper. onItemRangeChanged ( positionStart, itemCount, payload) ) {
this . triggerUpdateProcessor ( ) ;
}
}
public void onItemRangeInserted ( int positionStart, int itemCount) {
RecyclerView. this . assertNotInLayoutOrScroll ( ( String) null) ;
if ( RecyclerView. this . mAdapterHelper. onItemRangeInserted ( positionStart, itemCount) ) {
this . triggerUpdateProcessor ( ) ;
}
}
public void onItemRangeRemoved ( int positionStart, int itemCount) {
RecyclerView. this . assertNotInLayoutOrScroll ( ( String) null) ;
if ( RecyclerView. this . mAdapterHelper. onItemRangeRemoved ( positionStart, itemCount) ) {
this . triggerUpdateProcessor ( )