Sabir Hossain
Sabir Hossain

Reputation: 1205

How to set OnClickListener() for Button inside RecyclerView

I have a RecyclerView with 2 Buttons now i'm trying to set onClickListner for my Buttons inside RecyclerView. How can I set onClickListener for my Buttons inside recyclerView?

public class CartRecycleAdapter extends RecyclerView.Adapter<CartRecycleAdapter.RecycleViewHolder> {

private ArrayList<CartDataProvider> arraylist = new ArrayList<>();

public CartRecycleAdapter(ArrayList<CartDataProvider> arraylist){
    this.arraylist = arraylist;
}

@Override
public RecycleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.modelcart, parent,false);
    RecycleViewHolder recycleViewHolder = new RecycleViewHolder(view);
    return recycleViewHolder;
}

@Override
public void onBindViewHolder(RecycleViewHolder holder, int position) {

   CartDataProvider homeCycleDataProvider = arraylist.get(position);

    holder.ItemImage.setImageResource(R.drawable.placeholder);
    holder.TXV_ItemName.setText(homeCycleDataProvider.getItemName().toString());
    holder.TXV_PastPrice.setText(String.valueOf(homeCycleDataProvider.getPastPrice()).toString());
    holder.TXV_FixedPrice.setText(String.valueOf(homeCycleDataProvider.getFixedPrice()).toString());
    holder.ratingBar.setRating(homeCycleDataProvider.getRating());
}

@Override
public int getItemCount() {
    return arraylist.size();
}

public static class RecycleViewHolder extends RecyclerView.ViewHolder{

    ImageView ItemImage;
    TextView TXV_ItemName, TXV_PastPrice, TXV_FixedPrice, TXV_Percentage,TXV_Quantity;
    ImageButton BTN_QuantityMinus, BTN_QuantityPlus;
    RatingBar ratingBar;


    public RecycleViewHolder(View view){

        super(view);

        ItemImage = (ImageView) view.findViewById(R.id.item_image);
        TXV_ItemName = (TextView) view.findViewById(R.id.item_name);
        TXV_PastPrice = (TextView) view.findViewById(R.id.past_price);
        TXV_FixedPrice = (TextView) view.findViewById(R.id.fixed_price);
        TXV_Percentage = (TextView) view.findViewById(R.id.percentiage);
        ratingBar = (RatingBar) view.findViewById(R.id.ratingBar);
        TXV_Quantity = (TextView) view.findViewById(R.id.txv_quantity);
        BTN_QuantityMinus = (ImageButton) view.findViewById(R.id.quantity_minus);
        BTN_QuantityPlus = (ImageButton) view.findViewById(R.id.quantity_plus);

    }
}

}

here is my Fragment for RecyclerView

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_cart, container, false);

    TXT_TotalAmout = (TextView) view.findViewById(R.id.txt_total_amount);
    TXT_Quantity = (TextView) view.findViewById(R.id.txv_quantity);
    BTN_QuantityMinus = (ImageButton) view.findViewById(R.id.quantity_minus);
    BTNQuantityPlus = (ImageButton) view.findViewById(R.id.quantity_plus);

    CartItemRecyclerView = (RecyclerView) view.findViewById(R.id.item_recycler_id);

    int i =0;
    for (String name : itemname){

        CartDataProvider cartDataProvider = new CartDataProvider(itemname[i], imageurl[i],
                rating[i],pastprice[i],fixedprice[i]);

        arrayList.add(cartDataProvider);

        TotalPrice += fixedprice[i];
        i++;
    }

    TXT_TotalAmout.setText(Double.valueOf(TotalPrice).toString());
    adapter = new CartRecycleAdapter(arrayList);
    CartItemRecyclerView.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(getActivity());
    CartItemRecyclerView.setLayoutManager(layoutManager);
    CartItemRecyclerView.setAdapter(adapter);
    CartItemRecyclerView.setNestedScrollingEnabled(false);

    return view;
}

Upvotes: 0

Views: 3358

Answers (3)

joelg
joelg

Reputation: 1094

Since you have a reference to both of your buttons in your custom ViewHolder implementation, simply add an OnClickListener to each like so:

BTN_QuantityPlus.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // do your magic here
        }
});

You can set the listener in the onBindViewHolder method.

Upvotes: 1

Alexander Perfilyev
Alexander Perfilyev

Reputation: 6839

In your onCreateViewHolder

    recycleViewHolder.BTN_QuantityMinus.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
               //if you need position, just use recycleViewHolder.getAdapterPosition();
             }
        });

OR

Do the same in your RecycleViewHolder constructor.

    BTN_QuantityPlus.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // to get position use getAdapterPosition();
        }
    });

Upvotes: 1

Nilesh Singh
Nilesh Singh

Reputation: 1750

Do this:

    public class CartRecycleAdapter extends RecyclerView.Adapter<CartRecycleAdapter.RecycleViewHolder> {

        private ArrayList<CartDataProvider> arraylist = new ArrayList<>();

        public CartRecycleAdapter(ArrayList<CartDataProvider> arraylist){
            this.arraylist = arraylist;
        }

        @Override
        public RecycleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.modelcart, parent,false);
            RecycleViewHolder recycleViewHolder = new RecycleViewHolder(view);
            return recycleViewHolder;
        }

        @Override
        public void onBindViewHolder(RecycleViewHolder holder, int position) {

           CartDataProvider homeCycleDataProvider = arraylist.get(position);

            holder.ItemImage.setImageResource(R.drawable.placeholder);
            holder.TXV_ItemName.setText(homeCycleDataProvider.getItemName().toString());
            holder.TXV_PastPrice.setText(String.valueOf(homeCycleDataProvider.getPastPrice()).toString());
            holder.TXV_FixedPrice.setText(String.valueOf(homeCycleDataProvider.getFixedPrice()).toString());
            holder.ratingBar.setRating(homeCycleDataProvider.getRating());

            /*handle the click in the bindViewHolder inside
            the Recycler Adapter,not the fragment that calls this adapter.*/
            holder.BTN_QuantityMinus.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
                   //handle the click here.
                 }
            });
            holder.BTN_QuantityPlus.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
                   // handle the click here.
                 }
            });
        }

    @Override
    public int getItemCount() {
        return arraylist.size();
    }

    public static class RecycleViewHolder extends RecyclerView.ViewHolder{

        ImageView ItemImage;
        TextView TXV_ItemName, TXV_PastPrice, TXV_FixedPrice, TXV_Percentage,TXV_Quantity;
        ImageButton BTN_QuantityMinus, BTN_QuantityPlus;
        RatingBar ratingBar;


        public RecycleViewHolder(View view){

            super(view);

            ItemImage = (ImageView) view.findViewById(R.id.item_image);
            TXV_ItemName = (TextView) view.findViewById(R.id.item_name);
            TXV_PastPrice = (TextView) view.findViewById(R.id.past_price);
            TXV_FixedPrice = (TextView) view.findViewById(R.id.fixed_price);
            TXV_Percentage = (TextView) view.findViewById(R.id.percentiage);
            ratingBar = (RatingBar) view.findViewById(R.id.ratingBar);
            TXV_Quantity = (TextView) view.findViewById(R.id.txv_quantity);
            BTN_QuantityMinus = (ImageButton) view.findViewById(R.id.quantity_minus);
            BTN_QuantityPlus = (ImageButton) view.findViewById(R.id.quantity_plus);

        }
    }

Note: You need to clas setOnClickListener method inside the onBindViewHolder method where the data is acually given the layout components not the Fragment that you are using to set the adapter by creating an instance of it.

Upvotes: 2

Related Questions