为RecylerView添加item点击事件

使用了RecylerView来展示列表,少不了要有点击事件,但是Android官方并未给暴露出接口,只能自己实现。现在来总结一下自己的实现方式,供以后回顾参考。

步骤1:写一个接口,这个接口将来是点击事件传递的参数,代码如下:

interface OnItemClickListener{
//点击的哪个child和它的数据模型(也就是你解析数据时建的model)
void onClick(View view, PersonBean personBean);
}

让adapter实现点击接口:

private class MyRecylerAdapter extends Adapter<MyRecylerAdapter.MyRecylerViewHolder> implements View.OnClickListener 

在onCreateViewHolder方法里面为每个childView注册点击事件:

 @Override
    public MyRecylerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_recylerview, null);
        MyRecylerViewHolder holder = new MyRecylerViewHolder(view);
        //为每个View注册点击事件
        view.setOnClickListener(this);
        return holder;
    }

在onBindViewHolder方法中将数据给每个childView绑定上:

 @Override
    public void onBindViewHolder(MyRecylerViewHolder holder, int position) {
        PersonBean personBean = datas.get(position);
        holder.tv_user_name.setText(personBean.name);
        holder.tv_user_age.setText(String.valueOf(personBean.age));
        holder.iv_user_pic.setBackgroundResource(personBean.picture);
        //把数据设置给每个childView背上
        holder.itemView.setTag(personBean);
    }

在adapter中声明一个OnItemClickListener(我们自己写的接口)类型的变量,并且将adapter new出的对象设置给我们声明的这个变量:

private OnItemClickListener onItemClickListener = null;
//参数类型是我们自己写的接口,这个方法就是一会要用adapter来调用
    private void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

在点击时将数据取下来:

//这个点击事件是把childView上面的数据取下
    @Override
    public void onClick(View v) {
        if (onItemClickListener != null) {
            onItemClickListener.onClick(v, (PersonBean) v.getTag());
        }
    }

现在已经写完了,可以去和ListView一样去使用了,只是这个不是给RecylerView设置点击事件而是给adapter设置点击事件。

adapter.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onClick(View view, PersonBean personBean) {//携带回来的ChildView和这个View上面的数据
            Toast.makeText(MainActivity.this, "我的名字是:" + personBean.name + ",年龄是:" + personBean.age, Toast.LENGTH_SHORT).show();
        }
    });
``

apater的完整代码如下:

private class MyRecylerAdapter extends Adapter<MyRecylerAdapter.MyRecylerViewHolder> implements View.OnClickListener {

    private OnItemClickListener onItemClickListener = null;

    @Override
    public MyRecylerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_recylerview, null);
        MyRecylerViewHolder holder = new MyRecylerViewHolder(view);
        //为每个View注册点击事件
        view.setOnClickListener(this);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyRecylerViewHolder holder, int position) {
        PersonBean personBean = datas.get(position);
        holder.tv_user_name.setText(personBean.name);
        holder.tv_user_age.setText(String.valueOf(personBean.age));
        holder.iv_user_pic.setBackgroundResource(personBean.picture);
        //把数据设置给每个childView背上
        holder.itemView.setTag(personBean);
    }

    @Override
    public int getItemCount() {
        return datas.size();
    }

    //这个点击事件是把childView上面的数据取下
    @Override
    public void onClick(View v) {
        if (onItemClickListener != null) {
            onItemClickListener.onClick(v, (PersonBean) v.getTag());
        }
    }

    //参数类型是我们自己写的接口,这个方法就是一会要用adapter来调用
    private void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    //ViewHolder
    class MyRecylerViewHolder extends ViewHolder {

        private final ImageView iv_user_pic;
        private final TextView tv_user_name, tv_user_age;

        public MyRecylerViewHolder(View itemView) {
            super(itemView);
            iv_user_pic = (ImageView) itemView.findViewById(R.id.iv_user_pic);
            tv_user_name = (TextView) itemView.findViewById(R.id.tv_user_name);
            tv_user_age = (TextView) itemView.findViewById(R.id.tv_user_age);
        }
    }
}

接口的完整代码已经在上面给出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值