美文网首页
mAdapter.notifyDataSetChanged();

mAdapter.notifyDataSetChanged();

作者: guoheng1996 | 来源:发表于2018-08-03 11:39 被阅读0次

咱们先看看观察者模式和接口回调的关系:

https://blog.csdn.net/cauchyweierstrass/article/details/44593807#

接口回调:


public interface CallBack {
    public void oncall();
}

public class CallBackImp implements CallBack{
    @Override
    public void oncall() {
        System.out.println("回调函数被调用");
    }
}

public class A {
    private CallBack callback;
    //注册一个事件
    public void register(CallBack callback){
        this.callback = callback;
    }
    // 需要调用的时候回调
    public void call(){
        callback.oncall();
    }
}

public static void main(String[] args) {
    CallBack callback = new CallBackImp();
    A a = new A();
    a.register(callback);
    a.call();
}

观察者模式:

public interface Observer {
    public void update();
}

public class ConcreteObserver1 implements  Observer{
 
    public void update() {
        System.out.println("ConcreteObserver1获得更新");
    }
}

public class ConcreteObserver2 implements  Observer{
 
    public void update() {
        System.out.println("ConcreteObserver2获得更新");
    }
}

public class Subject {
 
    List<Observer> lists = new ArrayList<Observer>();
    
    //注册一个事件
    public void register(Observer observer){
        lists.add(observer);
    }
 
    public void _notify(){
        for (Observer observer : lists) {
            observer.update();
        }
    }
    
    public void unRegister(Observer observer){
        lists.remove(observer);
    }
}

public static void main(String[] args) {
    Observer observer1 = new ConcreteObserver1();
    Observer observer2 = new ConcreteObserver2();
    Subject subject = new Subject();
    subject.register(observer1);
    subject.register(observer2);
    subject._notify();
    //取消观察者1的注册
    subject.unRegister(observer1);
    subject._notify();
}


实际上,回调是观察者模式的简单形式。区别是观察者模式里面目标类维护了所有观察者的引用,而回调里面只是维护了一个引用。观察者模式也就是将回调上升到设计模式的理论高度上了而已。

此处使用RecyclerView来研究下:

mAdapter.notifyDataSetChanged();

之后就来到了
RecyclerView.Adaapter.java

  public final void notifyDataSetChanged() {
            mObservable.notifyChanged();
        }
继续向下:
RecyclerView.AdapterDataObservable.java

static class AdapterDataObservable extends Observable<AdapterDataObserver> {
     public void notifyChanged() {
            for (int i = mObservers.size() - 1; i >= 0; i--) {
                mObservers.get(i).onChanged();
            }
        }
}
继续向下:
RecyclerView.AdapterDataObserver.java

public abstract static class AdapterDataObserver {
        public void onChanged() {
            // Do nothing
        }
}

继续向下:
RecyclerView.RecyclerViewDataObserver.java

private class RecyclerViewDataObserver extends AdapterDataObserver {
        RecyclerViewDataObserver() {
        }

        @Override
        public void onChanged() {
            assertNotInLayoutOrScroll(null);
            mState.mStructureChanged = true;
            processDataSetCompletelyChanged(true);
            if (!mAdapterHelper.hasPendingUpdates()) {
                requestLayout();
            }
        }

重点就两个东西:
1:mObservable
2:mObservers

先看第一个:mObservable

    public abstract static class Adapter<VH extends ViewHolder> {
        private final AdapterDataObservable mObservable = new AdapterDataObservable();

第二个:mObserver

RecyclerView.java
private final RecyclerViewDataObserver mObserver = new RecyclerViewDataObserver();

那他们是在哪里关联的呢?

看一下

mRecyclerView.setAdapter(mPresenter.getAdapter());

RecyclerView.java
    public void setAdapter(Adapter adapter) {
        // bail out if layout is frozen
        setLayoutFrozen(false);
        setAdapterInternal(adapter, false, true);
        processDataSetCompletelyChanged(false);
        requestLayout();
    }

private void setAdapterInternal(Adapter adapter, boolean compatibleWithPrevious,
            boolean removeAndRecycleViews) {
        if (mAdapter != null) {
            mAdapter.unregisterAdapterDataObserver(mObserver);
            mAdapter.onDetachedFromRecyclerView(this);
        }
        if (!compatibleWithPrevious || removeAndRecycleViews) {
            removeAndRecycleViews();
        }
        mAdapterHelper.reset();
        final Adapter oldAdapter = mAdapter;
        mAdapter = adapter;
        if (adapter != null) {
            adapter.registerAdapterDataObserver(mObserver);
            adapter.onAttachedToRecyclerView(this);
        }
        if (mLayout != null) {
            mLayout.onAdapterChanged(oldAdapter, mAdapter);
        }
        mRecycler.onAdapterChanged(oldAdapter, mAdapter, compatibleWithPrevious);
        mState.mStructureChanged = true;
    }

  public abstract static class Adapter<VH extends ViewHolder> {
   public void registerAdapterDataObserver(@NonNull AdapterDataObserver observer) {
            mObservable.registerObserver(observer);
        }
}

我们来按照上面的模板梳理下:

public static void main(String[] args) {
    CallBack callback = new CallBackImp();
    A a = new A();
    a.register(callback);
    a.call();
}

private final RecyclerViewDataObserver mObserver = new RecyclerViewDataObserver();
private final AdapterDataObservable mObservable = new AdapterDataObservable();
               mObservable.registerObserver(observer);
               mObservable.notifyChanged();

题外话一下,官方把相关的类全放在一个.java文件里,我们是不是也可以这样呢。比如adapter放在fragment里面,建造数据model时,不用一个层级一个.java文件,而是全放在一起。

相关文章

网友评论

      本文标题:mAdapter.notifyDataSetChanged();

      本文链接:https://www.haomeiwen.com/subject/eoaevftx.html