简体   繁体   中英

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

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.

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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM