I am working with RecyclerView
and CardView
. I want to attach OnClickListner
to each card. I tried with many answers available on stackoverflow, but they are not working for me. So far I have tried -
public class SubjectAdapter extends RecyclerView.Adapter<SubjectAdapter.ViewHolder> implements View.OnClickListener,
View.OnLongClickListener{
private static final String LOGCAT = "SubjectAdapter";
private final Context mContext;
List<Subject> SubjectsList;
public SubjectAdapter(Context context) {
super();
this.mContext = context;
SQLiteDatabase.loadLibs(mContext);
DBHelper myDbHelper = new DBHelper(mContext);
SubjectsList = new ArrayList<Subject>();
SubjectsList = myDbHelper.getAllSubjects();
myDbHelper.close();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.subject_cardview_row, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(v);
// Below two lines are NOT working
viewHolder.tvSubjectName.setOnClickListener(this);
//viewHolder.setOnClickListener(this);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
Subject subject = SubjectsList.get(i);
viewHolder.tvSubjectName.setText(subject.getSubject_Name());
viewHolder.tvCounts.setText(String.valueOf(subject.getSubject_Number_of_Questions()));
// Below two lines are NOT working
viewHolder.tvSubjectName.setOnClickListener(this);
//viewHolder.setOnClickListener(this);
}
@Override
public int getItemCount() {
return SubjectsList.size();
}
@Override
public void onClick(View v) {
// It's not working either
ViewHolder holder = (ViewHolder) v.getTag();
int position = holder.getPosition();
if (v.getId() == holder.tvSubjectName.getId()){
Log.d(LOGCAT, "tvSubjectName onClick at" + position);
//Toast.makeText(mContext, "tvSubjectName onClick at" + position, Toast.LENGTH_LONG).show();
} else {
Log.d(LOGCAT, "RecyclerView Item onClick at " + position);
//Toast.makeText(mContext, "RecyclerView Item onClick at " + position, Toast.LENGTH_LONG).show();
}
}
@Override
public boolean onLongClick(View v) {
return false;
}
class ViewHolder extends RecyclerView.ViewHolder {
public TextView tvSubjectName;
public TextView tvCounts;
public ViewHolder(View itemView) {
super(itemView);
tvSubjectName = (TextView) itemView.findViewById(R.id.tv_subject_name);
tvCounts = (TextView) itemView.findViewById(R.id.tv_text_counts);
}
}
}
As one can see, I have tried setOnClickListener
with both onCreateViewHolder
and onBindViewHolder
, also as separate onClick
, but none of them seems to be working for me. So, I want to know, How to add OnClickListner to CardView?
View returned by onClick does not necessarily correspond to View row hierarchy of the recycler view. I think you should modify
onBindViewHolder
withIf you use long click then replace
View.OnClickListener
withView.OnLongClickListener
andonClick
withonLongClick
.Set OnClickListener to itemView in RecyclerView.ViewHolder constructor, also you can fetch position of cardView using
getAdapterPosition()
method which can help you to pass the data to new activity using putExtra method of intent. doc for getAdapterPosition method`
`
Check out Lucas Rocha's new TwoWayView API.
Follow his site and implementation of the API is relatively simple and might help you through some of the difficult complexities RecyclerView and CardView pose.
http://lucasr.org/2014/07/31/the-new-twowayview/
If you really want to implement onclick listener then do the following
2.setOnClickListener to the view object you declared(in ViewHolder) onBindViewHolder in the Adapter class
this will work for the entire cardView
This worked for me ! Put the setOnClickListener-method inside the constructor of your ViewHolder class.
}