Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.1k views
in Technique[技术] by (71.8m points)

android - 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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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
       }
    }
    

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...