【问题标题】:Price wrongly updating价格错误更新
【发布时间】:2019-01-19 15:11:53
【问题描述】:

我对购物车中单件商品的总价更新错误。如果我增加数量并减少数量,则会发生以下情况:

增加数量1=4,10; 2=4,10; 3=8,20; 4=12,30;减少数量:从 4(16,30) 到 3 = 16,40; 2 = 12,30; 1=8,20;

但所有商品的总价是正确的。

public class CartAdapter extends RecyclerView.Adapter<CartViewHolder> {

private List<Order> listData = new ArrayList<>();
private Cart cart;

public CartAdapter(List<Order> listData, Cart cart) {
    this.listData = listData;
    this.cart = cart;
}
@NonNull
@Override
public CartViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(cart);
    View itemView = inflater.inflate(R.layout.cart_layout, parent, false);
    return new CartViewHolder(itemView);
}

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


    holder.btn_quantity.setNumber(listData.get(position).getQuantity());
    holder.btn_quantity.setOnValueChangeListener(new ElegantNumberButton.OnValueChangeListener() {
        @Override
        public void onValueChange(ElegantNumberButton view, int oldValue, int newValue) {

            Locale locale = new Locale("de", "DE");
            NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
            double price = (Double.parseDouble(listData.get(position).getPrice()))*(Double.parseDouble(listData.get(position).getQuantity()));
            //int price = (Integer.parseInt(listData.get(position).getPrice()))*(Integer.parseInt(listData.get(position).getQuantity()));
            holder.txt_price.setText(fmt.format(price));
            holder.txt_cart_name.setText(listData.get(position).getProductName());

            Order order = listData.get(position);
            order.setQuantity(String.valueOf(newValue));
            new Database(cart).updateCart(order);

            double total = 0;
            List<Order> orders = new Database(cart).getCarts();
            for (Order item:orders)
                total+=(Double.parseDouble(order.getPrice()))*(Integer.parseInt(item.getQuantity()));

            cart.txtTotalPrice.setText(fmt.format(total));
        }
    });

    Locale locale = new Locale("de", "DE");
    NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
    double price = (Double.parseDouble(listData.get(position).getPrice()))*(Double.parseDouble(listData.get(position).getQuantity()));
    //int price = (Integer.parseInt(listData.get(position).getPrice()))*(Integer.parseInt(listData.get(position).getQuantity()));
    holder.txt_price.setText(fmt.format(price));
    holder.txt_cart_name.setText(listData.get(position).getProductName());
}


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

【问题讨论】:

    标签: java android counter


    【解决方案1】:

    可能问题出在代码的顺序上,你应该把这段代码:

    Order order = listData.get(position);
    order.setQuantity(String.valueOf(newValue));
    new Database(cart).updateCart(order);
    

    在开头:

    public void onValueChange(ElegantNumberButton view, int oldValue, int newValue) {
      // event listener code
    }
    

    这个块。

    希望对你有帮助:)

    【讨论】:

    • 如您所说“增加数量 1=4,10;2=4,10;3=8,20;4=12,30;减少数量:从 4(16,30) 到 3 = 16,40; 2 = 12,30; 1=8,20;”,显然每个数量都显示了之前输入的数量的值,这说明代码序列肯定有问题,所以如果我的答案没有不行,试试看顺序。
    • 顺便说一句,我喜欢你的编码风格,但是有一个提示,在编程中,程序员通常遵循 DRY 原则,即不要重复自己,并且在你的代码中,你使用了 NumberFormat 和 Locale in eventListener 制作每个项目,每个项目都会有一个新实例,您可以在 onBindViewHolder() 方法中创建一个 FINAL NumberFormat 并一次又一次地使用相同的实例,甚至为整个类创建一个私有实例,它肯定会减少内存使用并提高效率。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 2017-03-26
    相关资源
    最近更新 更多