在开发中,RecyclerView以其灵活的布局等特性逐渐替代了ListView和GridView。但是RecyclerView自身并没有item的点击事件监听。这就需要我们自己去设置监听了。
原理:
为RecyclerView的每个子item设置setOnClickListener,然后在onClick中再调用一次对外封装的接口,将这个事件传递给外面的调用者。
1、声明一个接口(这里使用了泛型,方便通用;也可指定数据的类型),模拟了ListView的OnItemClickListener,声明onClick方法 和 onLongClick方法,分别对应 点击事件和 长按事件。
public interface OnItemClickCallback<T> {
// 点击事件
void onClick(View view , T info);
// 长按事件
void onLongClick(View view , T info);
}
2、在adapter中申明一个该接口变量
// item条目布局注入器
private LayoutInflater mInflater;
// 申明一个点击事件接口变量
private OnItemClickCallback callback = null;
并在构造方法中,传入实例,用来将点击事件转移给外面的调用者。
public MyAdapter(Context ctx, OnItemClickCallback clickCallback){
this.mInflater = LayoutInflater.from(mContext);
this.callback = clickCallback;
}
在onBindViewHolder方法中将点击事件转移给外面的调用者:
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
// 给item中的指定控件添加点击事件(可以是item的子控件,也可以是itemView本身)
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
callback.onClick(view,jsList.get(position));
}
});
}
在Activity中使用
RecyclerView.LayoutManager manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
myRecycler.setLayoutManager(manager);
// OnItemClickCallback<JsInfo>这里指定数据类型(一般为item的数据模型)
myAdapter= new MyAdapter(this, new OnItemClickCallback<JsInfo>() {
@Override
public void onClick(View view, JsInfo info) {
Toast.makeText(this,"点击了"+info.getName(),Toast.LENGTH_SHORT).show();
}
@Override
public void onLongClick(View view, JsInfo info) {
Toast.makeText(this,"长按了"+info.getName(),Toast.LENGTH_SHORT).show();
}
});
myAdapter.setJsData(mDataList);
myRecycler.setAdapter(myAdapter);
效果图
由于没有添加分割线,界面比较难看。添加分割线点击http://www.jianshu.com/p/fe41428ca2f3