Android中最常见的观察者模式

Android中最常见的观察者模式

我们在Android中经常使用观察者模式,今天就将它最常用的方式梳理清楚。

常规观察者模式

在这里插入图片描述
如上图显示:主要是一个主题和一个观察者类,主题将观察者加入自身列表中,一旦发生事件则通知观察者,观察者调用自身update方法进行更新。

Android中常见的观察者模式的写法

public class RecyclerAdapter<Data>
        extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder<Data>> implements View.OnClickListener {
        ......
        private final List<Data> mDataList;
        private AdapterListener<Data> mListener;

        public RecyclerAdapter(List<Data> dataList, AdapterListener<Data> listener) {
            this.mDataList = dataList;
            this.mListener = listener;
        }

        /**
        * Create a ViewHolder.
        * @param parent RecyclerView.
        * @param viewType The View Type, appoint to the id of xml file.
        * @return ViewHolder.
        */
        @NonNull
        @Override
        public ViewHolder<Data> onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            ......
            // set the click listener.
            root.setOnClickListener(this);
            .......
            return holder;
        }

        @Override
        public void onClick(View v) {
            ViewHolder viewHolder = (ViewHolder) v.getTag(R.id.tag_recycler_holder);
            if (null != this.mListener) {
                // Get the corresponded position of the viewHolder.
                int position = viewHolder.getAdapterPosition();
                // Callback onItemClick.
                this.mListener.onItemClick(viewHolder, mDataList.get(position));
            }
        }

        /**
        * Customized click listener.
        * @param <Data>
        */
        public interface AdapterListener<Data> {
            void onItemClick(RecyclerAdapter.ViewHolder viewHolder, Data data);
        }
        ......
}

这是一段为RecyclerView准备的Adapter的基类,先大致解释一下几个方法。

  1. onCreateViewHolder() 覆写RecyclerView.Adapter的onCreateViewHolder()方法。

    在这个方法里,为root设置了OnClickListener,而RecyclerAdapter也实现了View.OnClickListener接口,所以这里参数是this.

  2. RecyclerAdapter() RecyclerAdapter的构造方法。

    这个方法中,主要进行了mListener的赋值,这个mListener是接口AdapterListener对象。

  3. onClick() RecyclerAdapter实现View.OnClickListener接口的覆写方法。

    这个方法中,调用了mListener接口对象中的onItemClick,并且传入了对应的参数。

  4. interface AdapterListener 自定义接口,其中定义了onItemClick()方法。

这种常规的写法相信大家都很熟悉,为view设置监听器,主类实现View.OnClickListener接口并重写onClick方法,再通过自定义接口将点击事件继续向外传递。这里的步骤其实涉及到了两次观察者模式的使用,一次是view和RecyclerAdapter之间的通知,一次是RecyclerAdapter和定义RecyclerAdapter子类变量的地方(这里没有具体编写Activity或Fragment的代码)。

  • View和RecyclerAdapter之间的观察者模式

      在两者中,View就是观察者模式中的主题,而RecyclerAdapter是观察者模式中的观察者。
    
      View通过setOnClickListener(this)方法,将RecyclerAdapter以观察者的身份添加进了自身的列表。一旦有点击事件发生,View则会调用onClick方法,也就是RecyclerAdapter收到了点击事件的回调。
    
      以下两段代码都是View.java中的(有省略),这两个方法所做的就相当于Subject的attach()和notify()方法。
    
    public void setOnClickListener(@Nullable OnClickListener l) {
        if (!isClickable()) {
            setClickable(true);
        }
        getListenerInfo().mOnClickListener = l;
    }
    
    public boolean performClick() {
        final ListenerInfo li = mListenerInfo;
        if (li != null && li.mOnClickListener != null) {
            playSoundEffect(SoundEffectConstants.CLICK);
            li.mOnClickListener.onClick(this);
            result = true;
        } else {
            result = false;
        }
        return result;
    }
    
  • RecyclerAdapter和调用RecyclerAdapter子类变量的地方。

    RecyclerAdapter摇身一变,变成了主题,其中的mListener就是其存储的观察者的对象,通过这个对象,来传递事件。

    那么一般来说,观察者是这样写的:

    public class MainActivity extends Activity{
        private MainRecyclerAdapter mAdapter;
    
        @Override
        public void onCreate(...) {
            mAdapter = new MainRecyclerAdapter();
            mAdapter.setListener(RecyclerAdapter.AdapterListenerImpl<GalleryImage>() {
                @Override
                public void onItemClick(...) {
                    // view.setText();
                }
            });
        }
    
        private class MainRecyclerAdapter extends RecyclerAdapter<Data> {
            ......
        }
    }
    

常用这样的写法,今日梳理一下。如有不正,还望指摘。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值