RecyclerView中的设计模式解读

发布时间:2023年12月17日

一.观察者模式:(待完善,这个写的不咋地,没理解透彻)

1.观察者模式的概念:

(1)消息传递方向:被观察者->观察者

(2)代码实现:

首先具有一个接口,该接口是所有观察者的父接口,各个子观察者通过实现这个接口来实例化一个观察者对象,而被观察者会持有观察者对象的引用。至于怎么将观察者对象传给这个引用的方法有很多,比如通过在被观察者对象类里面写set方法让观察者对象来调用、利用构造函数的参数传递等等。

(3)快速记忆:

被观察者:持有引用;在什么时候去做这件事情;

观察者:实现接口;具体做什么事情;

2.RecyclerView中的观察者模式:

(1)简介:RecyclerView中的Adapter的整体实现就是一个观察者模式

(2)源码分析:(以notifyDataSetChanged()为例)

<1>RecyclerView中的Adapter,是一个内部静态类:

public abstract static class Adapter<VH extends RecyclerView.ViewHolder> {
        //被观察者
        private final RecyclerView.AdapterDataObservable mObservable = new RecyclerView.AdapterDataObservable();
        //注册观察者
        public void registerAdapterDataObserver(@NonNull RecyclerView.AdapterDataObserver observer) {
            this.mObservable.registerObserver(observer);
        }
        //注销观察者
        public void unregisterAdapterDataObserver(@NonNull RecyclerView.AdapterDataObserver observer) {
            this.mObservable.unregisterObserver(observer);
        }
        //调用被观察者的方法
        public final void notifyDataSetChanged() {
            this.mObservable.notifyChanged();
        }

    }

<2>AdapterDataObservable ,被观察者对象类:

 static class AdapterDataObservable extends Observable<RecyclerView.AdapterDataObserver> {
        public void notifyChanged() {
            for(int i = this.mObservers.size() - 1; i >= 0; --i) {
                //遍历所有的子观察者,调用子观察者的onChanged()方法
                ((RecyclerView.AdapterDataObserver)this.mObservers.get(i)).onChanged();
            }
        }
    }

<3>AdapterDataObserver 类,调用onChanged()方法,这是抽象类:

 public abstract static class AdapterDataObserver {
        public void onChanged() {
        }
    }

<4>RecyclerViewDataObserver 类,为AdapterDataObserver类的实现类,真正调用onChanged()方法的地方:

 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();
            }
        }
    }

<5>setAdapter()方法,调用此方法来设置adapter:

 public void setAdapter(@Nullable RecyclerView.Adapter adapter) {
        this.setLayoutFrozen(false);
        this.setAdapterInternal(adapter, false, true);
        this.processDataSetCompletelyChanged(false);
        this.requestLayout();
    }

<6>setAdapterInternal()方法

 private void setAdapterInternal(@Nullable RecyclerView.Adapter adapter, boolean compatibleWithPrevious, boolean removeAndRecycleViews) {
        if (this.mAdapter != null) {
            //注销观察者
            this.mAdapter.unregisterAdapterDataObserver(this.mObserver);
            this.mAdapter.onDetachedFromRecyclerView(this);
        }
        if (adapter != null) {
            //注册观察者
            adapter.registerAdapterDataObserver(this.mObserver);
            adapter.onAttachedToRecyclerView(this);
        }
    }

(3)总结:

Recyclerview中的Adapter可以理解为观察者的父类,我们可以自己实现一个继承自Recyclerview中的Adapter的子类,也就是实例化一个观察者对象。然后通过Recyclerview中的setAdapter()方法可以将这个对象设置给被观察者。例如此时在这个对象中调用notifyDataSetChanged()方法,那么最终会调用被观察者的notifyChanged()方法。

二.其他(待更新)

RecyclerView 中的设计模式 | Agehua

文章来源:https://blog.csdn.net/xiaokang666/article/details/135036368
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。