Change value of TextView on Item Click inside a RecyclerView?

11,446

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();
Share:
11,446

Related videos on Youtube

Wilson Christian
Author by

Wilson Christian

Updated on September 14, 2022

Comments

  • Wilson Christian
    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
    Himani over 3 years
    saved my day :)