Java 从Recyclerview适配器类更新textview

Java 从Recyclerview适配器类更新textview,java,android,android-recyclerview,e-commerce,Java,Android,Android Recyclerview,E Commerce,我正在开发一个电子商务应用程序来下一些在线订单。在my Recyclerview中,有在上一个活动中添加的产品。在这里,我用诸如商品名称、数量、价格等详细信息填充Recyclerview中添加的产品。。有用于增加/减少每个产品数量的按钮,还有一个用于删除项目的按钮 在Recyclerview布局的底部,有另一个文本视图显示总计。当我处理RecycleServiceAdapter类中的按钮滑动时,当用户更新数量或删除项目时,我必须更新总计。我尝试了这里已经提到的一些解决方案,但是应用程序在随机点击

我正在开发一个电子商务应用程序来下一些在线订单。在my Recyclerview中,有在上一个活动中添加的产品。在这里,我用诸如商品名称、数量、价格等详细信息填充Recyclerview中添加的产品。。有用于增加/减少每个产品数量的按钮,还有一个用于删除项目的按钮

在Recyclerview布局的底部,有另一个文本视图显示总计。当我处理RecycleServiceAdapter类中的按钮滑动时,当用户更新数量或删除项目时,我必须更新总计。我尝试了这里已经提到的一些解决方案,但是应用程序在随机点击按钮时崩溃。请提供解决方案或更好的方法

以下是我的适配器类:

public class InvoiceRecyclerViewAdapter extends RecyclerView.Adapter<InvoiceRecyclerViewAdapter.ViewHolder> {
    private static final String TAG = "RecylerViewAdapter";

    List<Products> addedProductsList;
    Context mContext;


    public InvoiceRecyclerViewAdapter(Context mContext,List<Products> addedProductsList)
    {
        this.mContext=mContext;
        this.addedProductsList=addedProductsList;

    }
    public InvoiceRecyclerViewAdapter(Context mContext)
    {
        this.mContext=mContext;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_invoice,parent,false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {

        holder.item_qty.setText("1");
        holder.itemname.setText(addedProductsList.get(position).getName());
        holder.itemprice.setText("Rs "+addedProductsList.get(position).getPrice());
        holder.itemdiscount.setText("Rs "+calculate_dis(position));
        holder.itemtotal.setText("Rs "+calculate_total(position));


        holder.button_inc.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int qty = addedProductsList.get(position).getQty();
                qty++;
                addedProductsList.get(position).setQty(qty);
                holder.item_qty.setText(""+qty);
                holder.itemdiscount.setText("Rs "+calculate_dis(position));
                holder.itemtotal.setText("Rs "+calculate_total(position));

                UpdateTotal();

            }
        });

        holder.button_dec.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int qty = addedProductsList.get(position).getQty();
                qty--;
                if(qty>0){
                    addedProductsList.get(position).setQty(qty);
                    holder.item_qty.setText(""+qty);
                    holder.itemdiscount.setText("Rs"+calculate_dis(position));
                    holder.itemtotal.setText("Rs"+calculate_total(position));

                    UpdateTotal();
                }

            }
        });

        holder.button_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addedProductsList.get(position).setAddedTocart(false);
                //notifyDataSetChanged();
                addedProductsList.remove(position);
                notifyItemRemoved(position);

                UpdateTotal();
            }
        });
    }

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


    public class ViewHolder extends RecyclerView.ViewHolder{

        TextView itemname,itemtotal,itemprice,itemdiscount,item_qty;
        Button button_cancel,button_inc,button_dec;
        ConstraintLayout parent_layout;

        public ViewHolder(View itemView) {
            super(itemView);
            itemname = itemView.findViewById(R.id.textView_item_name);
            itemprice = itemView.findViewById(R.id.textView_item_price);
            itemdiscount = itemView.findViewById(R.id.textView_item_discount);
            itemtotal = itemView.findViewById(R.id.textView_item_total);
            button_cancel = itemView.findViewById(R.id.button_cancel);
            button_inc=itemView.findViewById(R.id.button_inc);
            button_dec=itemView.findViewById(R.id.button_dec);
            item_qty = itemView.findViewById(R.id.textView_qty);
            parent_layout = itemView.findViewById(R.id.invoice_parent_layout);

        }
    }

    private float calculate_dis(int pos){
        float dis = 0;
        if(addedProductsList.get(pos).isPrice_g_enabled()){
            int qty=addedProductsList.get(pos).getQty();
            dis = Float.parseFloat(addedProductsList.get(pos).getPrice())-Float.parseFloat(addedProductsList.get(pos).getPrice_g());
            dis = qty*dis;
        }
        return dis;


    }
    private float calculate_total(int pos){
        int qty=addedProductsList.get(pos).getQty();
        float price,total;
        if(addedProductsList.get(pos).isPrice_g_enabled()){
            price = Float.parseFloat(addedProductsList.get(pos).getPrice_g());
        }
        else{
            price= Float.parseFloat(addedProductsList.get(pos).getPrice());
        }

        total = price*qty;
        return total;
    }
    private void UpdateTotal(){

        TextView txtView =((EditQuantity)mContext).findViewById(R.id.textView_total);

        float total=0,price=0;
        int qty=0;
        for(int i=0;i<addedProductsList.size();i++){
            if(addedProductsList.get(i).isAddedTocart()) {
                qty = addedProductsList.get(i).getQty();
                if(addedProductsList.get(i).isPrice_g_enabled()){
                    price = Float.parseFloat(addedProductsList.get(i).getPrice_g());
                }
                else{
                    price= Float.parseFloat(addedProductsList.get(i).getPrice());
                }

            }
            total=total+(qty*price);
        }
        txtView.setText("Rs "+total);
    }
}
公共类InvoiceRecycleServiceAdapter扩展了RecyclerView.Adapter{ 私有静态最终字符串TAG=“RecylerViewAdapter”; 产品列表; 语境; 公共发票回收服务适配器(上下文mContext,列表AddedProductList) { this.mContext=mContext; 此.addedProductsList=addedProductsList; } 公共发票回收服务适配器(上下文mContext) { this.mContext=mContext; } @非空 @凌驾 public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){ View=LayoutFlater.from(parent.getContext()).flate(R.layout.layout\u发票,parent,false); ViewHolder ViewHolder=新的ViewHolder(视图); 返回视图持有者; } @凌驾 public void onBindViewHolder(@NonNull final ViewHolder,final int position){ 持有人项目数量设置文本(“1”); holder.itemname.setText(addedProductsList.get(position.getName()); holder.itemprice.setText(“Rs”+addedProductsList.get(position.getPrice()); holder.itemdiscount.setText(“Rs”+计算位置”); holder.itemtotal.setText(“Rs”+计算总数(位置)); holder.button_inc.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ int qty=addedProductsList.get(position.getQty(); 数量++; addedProductsList.get(位置).setQty(数量); 持有人项目数量设置文本(“+数量); holder.itemdiscount.setText(“Rs”+计算位置”); holder.itemtotal.setText(“Rs”+计算总数(位置)); UpdateTotal(); } }); holder.button\u dec.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ int qty=addedProductsList.get(position.getQty(); 数量--; 如果(数量>0){ addedProductsList.get(位置).setQty(数量); 持有人项目数量设置文本(“+数量); holder.itemdiscount.setText(“Rs”+计算位置”); holder.itemtotal.setText(“Rs”+计算总数(位置)); UpdateTotal(); } } }); holder.button\u cancel.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ addedProductsList.get(位置).setAddedTocart(错误); //notifyDataSetChanged(); 添加产品列表。移除(位置); 已移除(位置)的项目; UpdateTotal(); } }); } @凌驾 public int getItemCount(){ 返回addedProductsList.size(); } 公共类ViewHolder扩展了RecyclerView.ViewHolder{ text查看项目名称、项目总数、项目价格、项目折扣、项目数量; 按钮按钮取消,按钮公司,按钮取消; 约束视图父视图布局; 公共视图持有者(视图项视图){ 超级(项目视图); itemname=itemView.findViewById(R.id.textView\u item\u name); itemprice=itemView.findViewById(R.id.textView\u item\u price); item折扣=itemView.findViewById(R.id.textView\u item\u折扣); itemtotal=itemView.findViewById(R.id.textView\u item\u total); button\u cancel=itemView.findViewById(R.id.button\u cancel); button_inc=itemView.findViewById(R.id.button_inc); button\u dec=itemView.findViewById(R.id.button\u dec); item_数量=itemView.findViewById(R.id.textView_数量); 父布局=itemView.findViewById(R.id.invoice\u父布局); } } 专用浮点计算盘(int pos){ 浮点数dis=0; if(addedProductsList.get(pos.isPrice_g_enabled()){ int qty=addedProductsList.get(pos.getQty(); dis=Float.parseFloat(addedProductsList.get(pos.getPrice())-Float.parseFloat(addedProductsList.get(pos.getPrice_g()); dis=数量*dis; } 返回dis; } 私人浮动计算合计(整数位置){ int qty=addedProductsList.get(pos.getQty(); 浮动价格,总计; if(addedProductsList.get(pos.isPrice_g_enabled()){ price=Float.parseFloat(addedProductsList.get(pos.getPrice_g()); } 否则{ price=Float.parseFloat(addedProductsList.get(pos.getPrice()); } 总价=价格*数量; 返回总数; } 私有void UpdateTotal(){ TextView txtView=((EditQuantity)mContext).findViewById(R.id.TextView_总计); 浮动总额=0,价格=0; 整数数量=0;
for(inti=0;i我建议遍历一个侦听器,移动onclicklistener并删除for循环

所以,一步一步

在适配器类中声明一个接口

public interface OnQuantityChangeListener {
    void onQuantityChange( float change );
}
接下来,将专用OnQuantityChangeListener添加到适配器类,并将构造函数更改为在创建时添加一个:

private OnQuantityChangeListener mListener;

public InvoiceRecyclerViewAdapter(Context mContext,List<Products> addedProductsList, OnQuantityChangeListener listener) {
    this.mContext=mContext;
    this.addedProductsList=addedProductsList;
    mListener = listener;

}
public InvoiceRecyclerViewAdapter(Context mContext, OnQuantityChangeListener listener)
{
    this.mContext=mContext;
    mListener = listener;
}
请记住此时要卸下OnClic
private OnQuantityChangeListener mListener;

public InvoiceRecyclerViewAdapter(Context mContext,List<Products> addedProductsList, OnQuantityChangeListener listener) {
    this.mContext=mContext;
    this.addedProductsList=addedProductsList;
    mListener = listener;

}
public InvoiceRecyclerViewAdapter(Context mContext, OnQuantityChangeListener listener)
{
    this.mContext=mContext;
    mListener = listener;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_invoice,parent,false);
    ViewHolder viewHolder = new ViewHolder(view);

    viewHolder.button_inc.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Products product = addedProductsList.get(getAdapterPosition());

            product.setQty( product.getQty() + 1 );

            float difference = product.isPrice_g_enabled() ? Float.parseFloat(product.getPrice_g()) : Float.parseFloat(product.getPrice());

            mListener.onQuantityChange( difference );

            notifyItemChanged( getAdapterPosition ):// This will call onBindViewAdapter again and change all your strings for you

        }
    });

    viewHolder.button_dec.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Products product = addedProductsList.get(getAdapterPosition());

            if( product.getQty() == 0 )// Can't remove an item if it's already at 0
                return;

            product.setQty( product.getQty() - 1 );

            float difference = product.isPrice_g_enabled() ? Float.parseFloat(product.getPrice_g()) : Float.parseFloat(product.getPrice());

            mListener.onQuantityChange( -difference );

            notifyItemChanged( getAdapterPosition ):// This will call onBindViewAdapter again and change all your strings for you

        }
    });

    viewHolder.button_cancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Products product = addedProductsList.get(getAdapterPosition());

            float difference = product.isPrice_g_enabled() ? Float.parseFloat(product.getPrice_g()) : Float.parseFloat(product.getPrice());

            mListener.onQuantityChange( -difference * product.getQty() );

            product.setQty( 0 );

            notifyItemChanged( getAdapterPosition ):// This will call onBindViewAdapter again and change all your strings for you

            // You decide at this point if you want to remove the item altogether or just show 0

        }
    });

    return viewHolder;
}
private float total = 0;
InvoiceRecyclerViewAdapter adapter = new InvoiceRecyclerViewAdapter(
        this ,cart_productslist, new InvoiceRecyclerViewAdapter.OnQuantityChangeListener(){

    @Override
    void onQuantityChange( float difference ){

        total += difference;
        total_textview.setText("Rs "+ total);

    }

} );