简体   繁体   中英

RecyclerView: how to catch the onClick on an ImageView?

I have an ImageView in CardViews of my RecyclerView. I would like to catch the onClick on the ImageView, like I already did with the ListView. So, in the public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) I tried with:

 myViewHolder.imageView.setClickable(true);
 myViewHolder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               Log.d("TEST", "Clicked");
            }

but this was totally ignored. The following code is working:

 myViewHolder.imageView.setImageResource(R.drawable.star_yellow);

What can I do?

Here's what I do in my project.

  1. Have an interface class somewhere in your project:

     public interface RecyclerViewClickListener { void onRowClicked(int position); void onViewClicked(View v, int position); } 
  2. In your RecyclerView.Adapter class, add this interface as a field and pass it to adapter via constructor:

     public class YourRecAdapter extends RecyclerView.Adapter<YourRecAdapter.SimpleViewHolder>{ private RecyclerViewClickListener listener; public YourRecAdapter(RecyclerViewClickListener listener){ this.listener = listener; } public static class SimpleViewHolder extends RecyclerView.ViewHolder { public SimpleViewHolder(View itemView, final RecyclerViewClickListener listener) { super(itemView); // find view ids here itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(listener != null) listener.onRowClicked(getAdapterPosition()); } }); someViewholderView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(listener != null) listener.onViewClicked(v, getAdapterPosition()); } }); } } } 
  3. Implement the interface in your Activity / Fragment:

     public class YourFragment extends Fragment implements RecyclerViewClickListener { @Override public void onViewClicked(View v, int position) { if(v.getId == R.id.yourDesiredView){ // Do your stuff here } } @Override public void onRowClicked(int position) { // Clicked entire row } } 

在Viewholder类中,您可以设置OnClickListener,但是您需要另一个接口才能将OnClick寄存器传递回适配器(或者您的预期目标所在的位置)。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM