RecyclerView onClick for multiple buttons and handling from Activity

Viewed 31289

I'm using RecyclerView with CardView and inside the CardView have 2 buttons. Now, have implemented the onClick events by implementing View.OnClickListener by the ViewHolder static class and overriding the event (its working )like

    @Override
    public void onClick(View v) {

        if (v.getId() == mClassBtn.getId()){

        }
        else if (v.getId() == mDaysBtn.getId()){

        }
     }

Looking for a solution/pattern to handle the Click in the Activity class like

adapter = new ItemsListAdapter(getActivity(), data, new CustomItemClickListener() { 

    @override
    public void onItemClick(View v, int position) {

       Log.d(TAG, "clicked position:" + position);
       // which button clicked and separate action for each button
    } 
});
// CustomItemClickListener -- interface in the adapter class which holds the click event .

The above code working fine and able to log the Clicks but not able to differentiate which button has clicked.

Appreciate any help

5 Answers

Here my solution if it could help someone.

You could click in one item of the recyclerview or one of the two buttons.

The interface implements:

onStudentItemClick, for click in the recyclerview item

onChatItemClick and onAbsenceItemClick for click the buttons

With

 holder.imgChat.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    mOnClickListener.onChatItemClick(mStudents.get(index));

                }
            });

I set the click listener for one button

And in the class StudentViewHolder I implement OnClickListener and override onClik

@Override
        public void onClick(View v) {

            if (mOnClickListener != null){
                int clickedPosition = getAdapterPosition();
                mOnClickListener.onStudentItemClick(mStudents.get(clickedPosition));
            }
        }

Here 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));
            }
        }
    }
}

Fragment the implement the interface:

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) {
    ...

}

I do it this way.

  1. Set an OnClickListener on your Button in the ViewHolder

  2. Create a method in your activity with the button position as a parameter

  3. Pass the position of the clicked entry and do stuff

ViewHolder

yourButton.setOnClickListener(new View.OnClickListener()
{
     @Override
     public void onClick(View v) 
     {

        int position = getAdapterPosition(); //Clicked entry in your List

        //Method from your activity
        yourActivity.methodOnBtnClick(position);
     }

Activity

public void methodOnBtnClick(int position)
{
    yourList.remove(position);
    recycler.getAdapter().notifyDataSetChanged();
}
Related