在做RecyclerView的item点击监听操作的时候,参考了 泡在网上的日子里的一篇blog,它里面提到了观察者模式,所以就找了相关的内容,记录下自己的一些理解,可能存在某些错误,希望指正。
首先贴出一下部分代码:
public class HomePageAdapter extends RecyclerView.Adapter<HomePageAdapter.MyViewHolder> {
private LayoutInflater mLayoutInflater;
private Context mContext;
private List<String> mDatas;
private OnRecyclerViewItemListener mOnRecyclerViewItemListener;
/**
* 构造方法
* @param context
* @param datas
*/
public HomePageAdapter(Context context , List<String> datas){
this.mContext = context;
this.mDatas = datas;
mLayoutInflater = LayoutInflater.from(context);
mOnRecyclerViewItemListener = null;
}
/**
* 创建ViewHolder
* @param parent
* @param viewType
* @return
*/
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mLayoutInflater.inflate(R.layout.homepage_item , parent , false);
MyViewHolder myViewHolder = new MyViewHolder(view);
return myViewHolder;
}
/**
* 绑定ViewHolder
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.textView.setText(mDatas.get(position));
holder.itemView.setTag(mDatas.get(position));
}
@Override
public int getItemCount() {
return mDatas.size();
}
//定义接口
public static interface OnRecyclerViewItemListener{
void onItemClick(View view , int position);
}
public void setOnItemClickListener(OnRecyclerViewItemListener listener){
this.mOnRecyclerViewItemListener = listener;
}
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
public TextView textView;
public MyViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.homepage_tv_title);
textView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(mOnRecyclerViewItemListener != null){
mOnRecyclerViewItemListener.onItemClick(v , getLayoutPosition());
}
}
}
}
/**
* RecyclerView item项点击事件
*/
private void homepageAdapterClick(){
//item监听事件
homePageAdapter.setOnItemClickListener(new HomePageAdapter.OnRecyclerViewItemListener() {
@Override
public void onItemClick(View view, int position) {
startActivity(new Intent(getActivity() , WritingActivity.class));
}
});
}
接下来引用一下概念(来自维基百科)
观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。
它的结构是:
(其实看到这里,从表现上看我觉得我的那个代码里好像有一点观察者模式的影子,就是我在Adapter里定义一个接口,那么这里就是Subject,里面的接口则是Observer,然后在Activity里去实例化一个mAdapter的时候,那么它就应该是ConcreteSubject了,这时候我通过调用mAdapter里的点击方法,也就应该是相当于ConcreteObserver了。如果我的理解没错的话)
所以它有四个角色:
抽象主题:包含attach(),detach(),notifyObserver()
具体主题:包含getState()和change()
抽象观察者:包含update()
具体观察者:包含update()
因此我觉得应该是将我们的具体观察者attach或detach到实例化的具体主题里,进行所谓的登记。然后当具体主题的对象发生了change的时候,那么就会调用change()方法,继而会通过getState()来判断状态,然后通过notifyObserver()来通知所有的相依的具体观察者。
待续。。。
参考:
维基百科:点击打开链接
《大话设计模式》:老板回来,我不知道——观察者模式
《JAVA与模式》之观察者模式:点击打开链接
为RecyclerView添加item的点击事件 点击打开链接