如何为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
相关产品推荐
相关产品推荐

