RecyclerView onClick for multiple buttons and handling from Activity

I use RecyclerView with CardView and there are 2 buttons inside CardView . onClick events are now implemented by implementing View.OnClickListener static View.OnClickListener class and overriding the event (its operation), for example

  @Override public void onClick(View v) { if (v.getId() == mClassBtn.getId()){ } else if (v.getId() == mDaysBtn.getId()){ } } 

Looking for a solution / template for handling Click in an Activity class, e.g.

 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 works fine and is able to register Clicks , but cannot tell which button is pressed.

Appreciate any help. Thank you in advance.

+5
source share
5 answers

here is the best way to achieve this: -

this is how i implemented

 public class FollowersDetailsAdapter extends RecyclerView.Adapter<FollowersDetailsAdapter.MyViewHolder> { private List<GetUserFollowDetailsResponseData> followersList; Context context; public FollowersDetailsAdapterListener onClickListener; public class MyViewHolder extends RecyclerView.ViewHolder { public TextView rv_tv_follower_name, rv_tv_follower_desig; public CircleImageView rv_iv_follower_image; RelativeLayout rv_rel_layout_followers, rel_layout_followers; LikeButton rv_iv_follower_icon; public MyViewHolder(View view) { super(view); rv_rel_layout_followers = (RelativeLayout) view.findViewById(R.id.rv_rel_layout_followers); rel_layout_followers = (RelativeLayout) view.findViewById(R.id.rel_layout_followers); rv_iv_follower_image = (CircleImageView) view.findViewById(R.id.rv_iv_follower_image); rv_tv_follower_name = (TextView) view.findViewById(R.id.rv_tv_follower_name); rv_tv_follower_desig = (TextView) view.findViewById(R.id.rv_tv_follower_desig); rv_iv_follower_icon = (LikeButton) view.findViewById(R.id.rv_iv_follower_icon); rel_layout_followers.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onClickListener.iconTextViewOnClick(v, getAdapterPosition()); } }); } } public FollowersDetailsAdapter(List<GetUserFollowDetailsResponseData> FollowersList, FollowersDetailsAdapterListener listener) { this.followersList = FollowersList; this.onClickListener = listener; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.followers_list_row, parent, false); return new MyViewHolder(itemView); } @Override public void onBindViewHolder(final MyViewHolder holder, final int position) { if (followersList.get(position).getImage() != null && !followersList.get(position).getImage().trim().equalsIgnoreCase("")) { Picasso.with(context) .load(followersList.get(position).getImage()) .resize(200, 200).into(holder.rv_iv_follower_image); } holder.rv_tv_follower_name.setText(followersList.get(position).getName()); holder.rv_tv_follower_desig.setText(followersList.get(position).getDescription()); if (followersList.get(holder.getAdapterPosition()).getID() == Integer.parseInt(ApplicationPreference.getUserId())) { holder.rv_iv_follower_icon.setVisibility(View.GONE); } else { holder.rv_iv_follower_icon.setVisibility(View.VISIBLE); if (followersList.get(position).getIsFollowing() == 0) { holder.rv_iv_follower_icon.setLiked(false); } else if (followersList.get(position).getIsFollowing() == 1) { holder.rv_iv_follower_icon.setLiked(true); } } holder.rv_iv_follower_icon.setOnLikeListener(new OnLikeListener() { @Override public void liked(LikeButton likeButton) { Log.e("liked", "bc"); onClickListener.iconImageViewOnClick(likeButton, position); } @Override public void unLiked(LikeButton likeButton) { onClickListener.iconImageUnFollowOnClick(likeButton, position); } }); } public interface FollowersDetailsAdapterListener { void iconTextViewOnClick(View v, int position); void iconImageViewOnClick(View v, int position); void iconImageUnFollowOnClick(View v, int position); } @Override public int getItemCount() { return followersList.size(); } } 

and in your activity where you initialize the adapter -

  followersDetailsAdapter = new FollowersDetailsAdapter(followersList, new FollowersDetailsAdapter.FollowersDetailsAdapterListener() { @Override public void iconTextViewOnClick(View v, int position) { gotoUserProfile(followersList.get(position).getID()); //Log.e("plz", "iconTextViewOnClick at position "+position); } @Override public void iconImageViewOnClick(View v, int position) { //Log.e("plz", "iconImageViewOnClick at position "+position); followUserProfile(followersList.get(position).getID(),1); } @Override public void iconImageUnFollowOnClick(View v, int position){ //Log.e("plz", "iconImageUnFollowOnClick at position "+position); followUserProfile(followersList.get(position).getID(),0); } }); 
+4
source

try this principle to create a connection between activity, adapter and interface, I hope this helps you:

Interface:

 public interface AdapterCallback { void onClickCallback(YourModel itemModel); } 

adapter:

 public class YourAdapter extends RecyclerView.Adapter<YourAdapter.ViewHolder> { private List<String> mList; private AdapterCallback callback; private Context context; public YourAdapter(List<String> list, AdapterCallback adapterCallback) { this.mList = list; adapter = adapterCallback } @Override public YourAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { context = parent.getContext(); LayoutInflater inflater = LayoutInflater.from(context); View item = inflater.inflate(R.layout.item_recycler, parent, false); return new ViewHolder(item); } @Override public void onBindViewHolder(YourAdapter.ViewHolder holder, int position) { YourModel itemModel = list.get(position); String lastName = itemModel.getLastName(); // for example; String firstName = itemModel.getFirstName(); // for example; holder.tvFirstName.setText(firstName); holder.tvLastName.setText(lastName); holder.tvFirstName.setOnClickListener( // you can override this onClick into your Activity. adapterCallback.onClickCallback(itemModel)); } } @Override public int getItemCount() { return mList.size(); } static class ViewHolder extends RecyclerView.ViewHolder { private TextView tvFirstName; private TextView tvLastName; ViewHolder(View itemView) { super(itemView); tvFirstName = (TextView) itemView.findViewById(R.id.tv_first); tvLastName = (TextView) itemView.findViewById(R.id.tv_last); } } 

Activity:

 public class MyActivity extends AppCompatActivity implements View.OnClickListener, AdapterCallback { private YourAdapter adapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void onClickCallback(YourModel itemModel) { Toast.makeText(this, itemModel.getFirstName(), Toast.LENGTH_SHORT).show(); } 

I think this information is enough to understand what I mean. In the same principle, you can create several OnClick methods in your interface or put one onClick for several buttons and check the identifier or something else to get the necessary information that you need. Luck

+1
source

try it

Do it in your work

 CustomItemClickListener listner; listner=YourActivityName.this // in OnCreate Method 

and skip this list in the adapter

 adapter = new ItemsListAdapter(getActivity(), data, listner); 

And in your adapter use it like this:

 CustomItemClickListener listner; this.listner=listner; // In your Adapter COnstructor 

and the last one in your onBindViewHolder, like this:

 holder.button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { listner.onItemClick(holder.getLayoutPosition()); //getting position } }); holder.button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { listner.onItemClick(holder.getLayoutPosition()); //getting position } }); 
0
source

I do it like this.

  • Set OnClickListener on your button in ViewHolder

  • Create a method in your activity with a button position as a parameter

  • Pass the position of the clicked record and do something.

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

Activities

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

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) { ... } 
0
source

Source: https://habr.com/ru/post/1268315/


All Articles