更新产品数量后总价不正确

时间:2019-12-27 10:02:53

标签: java android firebase-realtime-database

现在我正在做一个购物车列表,当用户将产品添加到购物车时,我将数量设置为= 1,当用户打开购物车时,它将显示购物车中产品的总价,在这里用户可以增加/减少购物车中的产品数量,总价格将一起更新。我现在面临的问题是当我增加或减少产品数量时,它显示的总价不正确

下面是CartActivity代码:

@Override
public void onStart()
{
    super.onStart();

    final DatabaseReference cartListRef = FirebaseDatabase.getInstance().getReference().child("Cart List");
    FirebaseRecyclerOptions<Cart> options =
            new FirebaseRecyclerOptions.Builder<Cart>()
            .setQuery(cartListRef.child("Cart")
                    .child(("Products")), Cart.class)
                    .build();

   FirebaseRecyclerAdapter<Cart, CartViewHolder> adapter = new FirebaseRecyclerAdapter<Cart, CartViewHolder>(options) {

       @Override
       protected void onBindViewHolder(@NonNull final CartViewHolder cartViewHolder, final int i, @NonNull final Cart cart)
       {
           cartViewHolder.btn_quantity.setNumber(cart.getQuantity());
           cartViewHolder.txtProductPrice.setText("Price = RM"+cart.getPrice());
           cartViewHolder.txtProductName.setText(cart.getProductName());

           cartViewHolder.btn_quantity.setOnValueChangeListener(new ElegantNumberButton.OnValueChangeListener() {
               @Override
               public void onValueChange(ElegantNumberButton view, int oldValue, int newValue)
               {
                 cart.setQuantity(String.valueOf(newValue));
                 cartListRef.child("Cart").child("Products").child(cart.getProductName()).child("quantity").setValue(String.valueOf(newValue));
                 getTotal();
               }

               private void getTotal()
               {
                   TotalPrice += (Integer.valueOf(cart.getPrice()) * Integer.valueOf(cart.getQuantity()));
               }
           });
           TotalPrice += (Integer.valueOf(cart.getPrice()) * Integer.valueOf(cart.getQuantity()));


}

Firebase实时数据库:

{
"Cart List" : {
"Cart" : {
  "Products" : {
    "BenQ" : {
      "MemPrice" : "150",
      "Price" : "300",
      "ProductName" : "BenQ",
      "date" : "27 Dec 2019",
      "quantity" : "2",
      "time" : "00:37:56 a.m."
    },
    "Dell" : {
      "MemPrice" : "5000",
      "Price" : "10000",
      "ProductName" : "Dell",
      "date" : "26 Dec 2019",
      "quantity" : "4",
      "time" : "20:52:07 p.m."
    },
    "Logitech" : {
      "MemPrice" : "5",
      "Price" : "10",
      "ProductName" : "Logitech",
      "date" : "26 Dec 2019",
      "quantity" : "1",
      "time" : "20:42:58 p.m."
    }
  }
}
  },
"Product" : {
"Product1" : {
  "Barcode" : "112233",
  "MemPrice" : "5",
  "Price" : "10",
  "ProductName" : "Logitech"
},
"Product2" : {
  "Barcode" : "123456",
  "MemPrice" : "5000",
  "Price" : "10000",
  "ProductName" : "Dell"
},
"Product3" : {
  "Barcode" : "778899",
  "MemPrice" : "150",
  "Price" : "300",
  "ProductName" : "BenQ"
   }
 }
}

我使用屏幕截图更清楚地说明了我的意思

这是我增加/减少数量之前的图像: Before increase/decrease

这是我已经增加/减少数量的图片: After increase/decrease

第一张图片没有问题,但第二张图片的总价应为RM 40610,但显示RM 112140

我希望有人可以帮助我找出代码中的问题或教我如何解决此问题。谢谢!

1 个答案:

答案 0 :(得分:1)

据我所知,导致问题的代码在这里:

cartViewHolder.btn_quantity.setOnValueChangeListener(new ElegantNumberButton.OnValueChangeListener() {
   @Override
   public void onValueChange(ElegantNumberButton view, int oldValue, int newValue)
   {
     cart.setQuantity(String.valueOf(newValue));
     cartListRef.child("Cart").child("Products").child(cart.getProductName()).child("quantity").setValue(String.valueOf(newValue));
     getTotal();
   }

   private void getTotal()
   {
       TotalPrice += (Integer.valueOf(cart.getPrice()) * Integer.valueOf(cart.getQuantity()));
   }
});
TotalPrice += (Integer.valueOf(cart.getPrice()) * Integer.valueOf(cart.getQuantity()));

最初,您正在此视图持有者中计算商品的价格,并将其添加到总计中:TotalPrice += (Integer.valueOf(cart.getPrice()) * Integer.valueOf(cart.getQuantity()));

但是,每次用户更改数量时,您都会再次将此持有人中所有商品的价格加到总计中。

所以说:

  • 用户从5个项目开始,每个项目的成本为20,您将总数增加100。
  • 然后,用户将同一项目之一添加到购物车,最后得到6。您将总数添加6 * 20 = 120,而对于用户添加的一项新项目,您应该只添加20。 li>

解决方案是仅添加oldValuenewValue项目之间的成本差:

   public void onValueChange(ElegantNumberButton view, int oldValue, int newValue)
   {
     cart.setQuantity(String.valueOf(newValue));
     cartListRef.child("Cart").child("Products").child(cart.getProductName()).child("quantity").setValue(String.valueOf(newValue));

     TotalPrice = TotalPrice + (newValue - oldValue) * cart.getPrice();
   }

一个不相关的建议:您将数字值作为字符串存储在数据库中,这会导致代码中进行大量类型转换。如果您将数值存储为实际数字,则可以摆脱所有的Integer.valueOf(...)String.valueOf(...)调用,并使代码更短,更易于阅读。