You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为RecyclerView中CardView的每个子项设置独立点击监听器

解决方案

第一步:修改适配器的回调接口

扩展原有回调接口,新增参数区分点击的控件类型:

public interface ItemClickListener{
    // clickType取值说明:0=点赞按钮,1=点踩按钮,2=删除按钮,3=用户头像,可自行扩展
    void onItemClick(reviews reviewItem, int clickType);
}

第二步:给所有需要响应点击的控件绑定事件

修改适配器onBindViewHolder方法,给所有子控件设置独立的点击监听,同时使用getBindingAdapterPosition避免RecyclerView复用导致的位置错误:

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    reviews currentReview = review.get(position);
    holder.rev_username.setText(currentReview.getUsername());
    holder.rev_text.setText(currentReview.getText());
    holder.rev_user_rating.setRating(currentReview.getUserrating());
    Picasso.get().load(currentReview.getProfilepicUrl()).fit().centerCrop().into(holder.rev_user_pic);
    holder.rev_like_nr.setText(String.valueOf(currentReview.getLikes()));
    holder.rev_dislike_nr.setText(String.valueOf(currentReview.getDislikes()));

    // 点赞按钮点击事件
    holder.rev_like_btn.setOnClickListener(view ->{
        int realPos = holder.getBindingAdapterPosition();
        if(realPos != RecyclerView.NO_POSITION){
            mItemListener.onItemClick(review.get(realPos), 0);
        }
    });
    // 点踩按钮点击事件
    holder.rev_dislike_btn.setOnClickListener(view ->{
        int realPos = holder.getBindingAdapterPosition();
        if(realPos != RecyclerView.NO_POSITION){
            mItemListener.onItemClick(review.get(realPos), 1);
        }
    });
    // 删除按钮点击事件
    holder.rev_delete_btn.setOnClickListener(view ->{
        int realPos = holder.getBindingAdapterPosition();
        if(realPos != RecyclerView.NO_POSITION){
            mItemListener.onItemClick(review.get(realPos), 2);
        }
    });
    // 用户头像点击事件,需其他子控件点击同理扩展即可
    holder.rev_user_pic.setOnClickListener(view ->{
        int realPos = holder.getBindingAdapterPosition();
        if(realPos != RecyclerView.NO_POSITION){
            mItemListener.onItemClick(review.get(realPos), 3);
        }
    });
}

第三步:在Activity中按点击类型执行对应逻辑

修改Activity中适配器初始化的回调部分,通过clickType判断点击的控件,执行不同操作:

myadapter = new reviewsAdapter(Restaurant_Reviews.this, reviewsArrayList, (reviewItem, clickType) -> {
    switch (clickType){
        case 0:
            // 点赞逻辑:更新点赞数、上报接口等
            Toast.makeText(Restaurant_Reviews.this, "点赞成功", Toast.LENGTH_SHORT).show();
            break;
        case 1:
            // 点踩逻辑
            Toast.makeText(Restaurant_Reviews.this, "点踩成功", Toast.LENGTH_SHORT).show();
            break;
        case 2:
            // 删除评论逻辑
            Toast.makeText(Restaurant_Reviews.this, "已删除评论", Toast.LENGTH_SHORT).show();
            break;
        case 3:
            // 跳转用户个人主页逻辑
            Toast.makeText(Restaurant_Reviews.this, "打开用户主页", Toast.LENGTH_SHORT).show();
            break;
    }
});

内容的提问来源于stack exchange,提问作者Zabava Mihai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:54:04