Here is my solution if it can help someone.
You can click on one recyclerview or one of two buttons.
The interface implements:
onStudentItemClick, to click in the recyclerview element
onChatItemClick and onAbsenceItemClick for button selection
WITH
holder.imgChat.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mOnClickListener.onChatItemClick(mStudents.get(index)); } });
I set a click listener for one button
And in the StudentViewHolder class, I implement OnClickListener and override onClik
@Override public void onClick(View v) { if (mOnClickListener != null){ int clickedPosition = getAdapterPosition(); mOnClickListener.onStudentItemClick(mStudents.get(clickedPosition)); } }
Here is the adapter:
public class StudentsAdapter extends RecyclerView.Adapter<StudentsAdapter.StudentsViewHolder> { private ListItemClickListener mOnClickListener; private ArrayList<Student> mStudents; public interface ListItemClickListener { void onStudentItemClick(Student student); void onChatItemClick(Student student); void onAbsenceItemClick(Student student); } public StudentsAdapter(ArrayList<Student> students, ListItemClickListener listener) { mStudents = students; mOnClickListener = listener; } @Override public StudentsViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { Context context = viewGroup.getContext(); int layoutIdForListItem = R.layout.student_list_item; LayoutInflater inflater = LayoutInflater.from(context); boolean shouldAttachToParentImmediately = false; View view = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately); StudentsViewHolder viewHolder = new StudentsViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(StudentsViewHolder holder, int position) { final Integer index = position; holder.tvStudent.setText(mStudents.get(position).nameForList()); holder.imgChat.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mOnClickListener.onChatItemClick(mStudents.get(index)); } }); holder.imgAbsence.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mOnClickListener.onAbsenceItemClick(mStudents.get(index)); } }); } public Student getItem(Integer position){ return mStudents.get(position); } @Override public int getItemCount() { return mStudents.size(); } class StudentsViewHolder extends RecyclerView.ViewHolder implements OnClickListener { ImageView imgStudent; TextView tvStudent; ImageButton imgChat, imgAbsence; public StudentsViewHolder(View itemView) { super(itemView); imgStudent = (ImageView) itemView.findViewById(R.id.img_student); tvStudent = (TextView) itemView.findViewById(R.id.tv_student); imgChat = (ImageButton) itemView.findViewById(R.id.btn_chat_student); imgAbsence = (ImageButton) itemView.findViewById(R.id.btn_absence); itemView.setOnClickListener(this); } @Override public void onClick(View v) { if (mOnClickListener != null){ int clickedPosition = getAdapterPosition(); mOnClickListener.onStudentItemClick(mStudents.get(clickedPosition)); } } } }
Interface implementation fragment:
public class SubjectDetailFragment extends Fragment implements StudentsAdapter.ListItemClickListener { ... @Override public void onStudentItemClick(Student student) { StudentDetailFragment detailFragment = StudentDetailFragment.newInstance(); Bundle bundle = new Bundle(); bundle.putParcelable("student", student); detailFragment.setArguments(bundle); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.frame_layout, detailFragment); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); } @Override public void onChatItemClick(Student student) { ... } @Override public void onAbsenceItemClick(Student student) { ... }
source share