RecyclerView 添加item点击事件

在开发中,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

点击item的效果图.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容