Change value of TextView on Item Click inside a RecyclerView?
Solution 1
1.In your activity initialize the TextView
TextView myTextview = (TextView) findViewByItd(R.id.textView);
2.Add a parameter TextView in the Adapter's constructor
3.Pass the TextView to the adapter
MyRecyclerAdapter adapter = new MyRecyclerAdapter(menu, myTextView);
4.Manipulate it as you want
ArrayList<MenuItem> MenuDetailList;
Typeface font;
TextView mTextView;
public MyRecyclerAdapter(ArrayList<MenuItem> MenuDetailArray, TextView tv){
this.MenuDetailList = MenuDetailArray;
mTextView = tv;
}
mTextView.setText("Eat more pizza");
Solution 2
Accepted answer is a hack. That is not the right way to do it. You can create an interface to pass your click event to your activity.
Create this interface in your adapter class.
public interface OnItemClickListener {
void onItemClick(View view, int position, String tag);
}
Then create an instance on class level of adapter.
private OnItemClickListener mItemClickListener;
and a method to set this listener.
public void setOnItemClickListener(final OnItemClickListener mItemClickListener) {
this.mItemClickListener = mItemClickListener;
}
Now in your activity do this.
AdapterClassName.OnItemClickListener onItemClickListener = new AdapterClassName.OnItemClickListener() {
@Override
public void onItemClick(View view, int position, String tag) {
//Do whatever you want to do on item click in your activity
}
}
mAdapter.setOnItemClickListener(onItemClickListener);
//mAdapter is your adapter instance
then last thing set click listener on your viewholder. I'm assuming your viewholder is present in adapter class only.
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public ViewHolder(View itemView) {
RelativeLayout mainHolder = (RelativeLayout) itemView.findViewById(R.id.main_holder);
mainHolder.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(mItemClickListener != null) {
mItemClickListener.onItemClick(itemView, getAdapterPosition(), itemView.getText().toString());
}
}
}
Solution 3
set tag onCreateViewHolder() that is your holder:
MyHolder holder = new MyHolder(v);
v.setTag(holder);
return holder;
Now you can get the data in your click listener:
MyHolder holder = (MyHolder)v.getTag();
Related videos on Youtube
Wilson Christian
Updated on September 14, 2022Comments
-
Wilson Christian over 1 year
I am developing an app for restaurant management, but stuck at a point where i need to update value of textview(outside of RecyclerView) on item click inside the RecyclerView.
This is my adapter, Consider a textView outside this adapter and set a value on item click of Plus and Minus ImageViews as shown in below code...
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyHolder> { ArrayList<MenuItem> MenuDetailList; Typeface font; public MyRecyclerAdapter(ArrayList<MenuItem> MenuDetailArray){ this.MenuDetailList = MenuDetailArray; } @Override public MyRecyclerAdapter.MyHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_menu_row_item, null); return new MyHolder(v); } @Override public void onBindViewHolder(final MyRecyclerAdapter.MyHolder holder, final int position) { holder.txtSubMenuTitle.setText(MenuDetailList.get(position).getTitle()); holder.txtSubMenuPrice.setText(MenuDetailList.get(position).getPrice()); holder.txtSubMenuCount.setText(""+MenuDetailList.get(position).getItemCount()); setCustomTypeface(holder.txtSubMenuTitle, font); setCustomTypeface(holder.txtSubMenuPrice,font); holder.ImgViewSubMenuMinus.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //holder.OrderCount = Integer.parseInt(holder.txtSubMenuCount.getText().toString()); int ItemCount = MenuDetailList.get(position).getItemCount(); if (ItemCount > 0) { ItemCount = ItemCount - 1; holder.txtSubMenuCount.setText("" + ItemCount); MenuDetailList.get(position).setItemCount(ItemCount); notifyDataSetChanged(); } } }); holder.ImgViewSubMenuPlus.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //holder.OrderCount = Integer.parseInt(holder.txtSubMenuCount.getText().toString()); int ItemCount = MenuDetailList.get(position).getItemCount(); if (ItemCount < 20) { ItemCount = ItemCount + 1; holder.txtSubMenuCount.setText("" + ItemCount); MenuDetailList.get(position).setItemCount(ItemCount); notifyDataSetChanged(); } }); } @Override public int getItemCount() { return MenuDetailList.size(); } public static class MyHolder extends RecyclerView.ViewHolder { TextView txtSubMenuTitle; TextView txtSubMenuPrice; ImageView ImgViewSubMenuMinus; ImageView ImgViewSubMenuPlus; TextView txtSubMenuCount; private MyHolder(View row) { super(row); this.txtSubMenuTitle = (TextView) row.findViewById(R.id.list_txt_sub_menu_title); this.txtSubMenuPrice = (TextView) row.findViewById(R.id.list_txt_sub_menu_price); this.txtSubMenuCount = (TextView) row.findViewById(R.id.list_txt_sub_menu_count); this.ImgViewSubMenuMinus = (ImageView) row.findViewById(R.id.list_img_sub_menu_minus); this.ImgViewSubMenuPlus = (ImageView) row.findViewById(R.id.list_img_sub_menu_plus); } } private void setCustomTypeface(TextView textView, Typeface font) { textView.setTypeface(font); } }
Thanks in advance...
-
Himani over 3 yearssaved my day :)