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的基类,先大致解释一下几个方法。
-
onCreateViewHolder() 覆写RecyclerView.Adapter的onCreateViewHolder()方法。
在这个方法里,为root设置了OnClickListener,而RecyclerAdapter也实现了View.OnClickListener接口,所以这里参数是this.
-
RecyclerAdapter() RecyclerAdapter的构造方法。
这个方法中,主要进行了mListener的赋值,这个mListener是接口AdapterListener对象。
-
onClick() RecyclerAdapter实现View.OnClickListener接口的覆写方法。
这个方法中,调用了mListener接口对象中的onItemClick,并且传入了对应的参数。
-
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> { ...... } }
常用这样的写法,今日梳理一下。如有不正,还望指摘。
本文深入探讨了Android中观察者模式的应用,详细介绍了如何在RecyclerView的Adapter中实现观察者模式,包括创建ViewHolder、设置监听器及事件传递的过程。
323

被折叠的 条评论
为什么被折叠?



