15

Làm cách nào để đính kèm một OnClickListener vào CardView? Tôi muốn mỗi thẻ có một hành động khác nhau khi được nhấp.OnClickListener cho CardView?

Tôi có một RecyclerView có bộ điều hợp tùy chỉnh để hiển thị thẻ. Đây là cách nó là implemented.

Trả lời

31

Bạn nên triển khai OnItemClickListener trong lớp ViewHolder và chuyển mục hiện tại tới các trường hợp ViewHolder trên mỗi onBindViewHolder().

Từ this post:

public static class ViewHolder extends RecyclerView.ViewHolder { 
    public View view; 
    public Item currentItem; 

    public ViewHolder(View v) { 
     super(v); 
     view = v; 
     view.setOnClickListener(new View.OnClickListener() { 
      @Override public void onClick(View v) { 
       // item clicked 
      } 
     }); 
    } 
} 

@Override public void onBindViewHolder(ViewHolder viewHolder, int i) { 
    viewHolder.currentItem = items.get(i); 
} 
+0

Cảm ơn bạn đã liên kết. Tôi định nghĩa người nghe ở đó. – MikkoP

+0

Bạn được chào đón, vui vì tôi có thể giúp đỡ. –

+0

Bạn có thể xây dựng câu trả lời của bạn nhiều hơn một chút .... làm thế nào tôi có thể biết được dòng cardView nào được nhấp ..... Nếu tôi sử dụng view, getId() nó trả về cùng một id. – Crawler

3
  1. bạn chỉ cần thêm onClick Listener, mà mục mà bạn muốn trong onBindViewHolder. nơi dễ dàng truy cập vào giá trị của vị trí đó. vui lòng kiểm tra mã bên dưới.

    @Override 
    public void onBindViewHolder(final MyViewHolder holder, final int position) { 
    
        holder.title.setText(Html.fromHtml(html2text(results.get(position).getTitle().toString()))); 
        holder.description.setText(Html.fromHtml(html2text(results.get(position).getSummary().toString()))); 
        holder.url.setText(Html.fromHtml(html2text(results.get(position).getUrl().toString()))); 
        holder.url.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View view) { 
          Intent intent=new Intent(mContext, DetailsActivity.class); 
          intent.putExtra("url",results.get(position).getUrl().toString()); 
          mContext. startActivity(intent); 
    
         } 
        }); 
    
1

Đây là giải pháp của tôi cho vấn đề này:

  1. Đầu tiên thêm tài liệu tham khảo để xem xem đối tượng trong lớp ViewHolder

    public static class TouristViewHolder extends RecyclerView.ViewHolder{ 
        public ImageView img; 
        public TextView name; 
        public TextView description; 
        public RatingBar rating; 
        public View view;    // <----- here 
    
        public TouristViewHolder(final View view) { 
         super(view); 
         this.view = view;   // <----- here 
         // ... rest of code 
        } 
    } 
    
  2. Tiếp theo, trong phương pháp onBindViewHolder(final MyViewHolder holder, final int position), tôi thêm người nghe và đặt Intent mới.

    @Override 
    public void onBindViewHolder(TouristViewHolder touristViewHolder, final int position) { 
    
    touristViewHolder.view.setOnClickListener(new View.OnClickListener() { // <--- here 
        @Override 
        public void onClick(View v) { 
         Log.i("W4K","Click-"+position); 
         context.startActivity(new Intent(context,MainActivity.class)); // <--- here 
        } 
    }); 
    

Nó hoạt động đối với tôi tốt, hy vọng nó sẽ giúp người khác.

Các vấn đề liên quan