【问题标题】:new object created every time每次创建新对象
【发布时间】:2015-06-14 01:21:46
【问题描述】:

我正在开发一个 android 和一个新手的购物车应用程序。我现在一直面临一个问题。 我可以添加一个项目并将其添加到购物车中。将商品添加到购物车后,我可以编辑商品的数量或将其从列表视图中删除。

所以我想要的是禁用 addToCart 按钮,如果它已经存在于购物车中,以避免重复。但是每一个进入产品的条目都被视为一个新条目。我想我没有正确引用它。任何帮助将不胜感激。

这是您每次按下某个项目时都会调用的 Activity(例如:笔记本电脑类别中的戴尔)

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.productdetails);
    LayoutInflater li;
    final List<Product> cart = ShoppingCartHelper.getCart();// get all //items from cart
    int productIndex = getIntent().getExtras().getInt(
            ShoppingCartHelper.PRODUCT_INDEX);// the item no in the list
    String PRODUCT_STRING = getIntent().getExtras().getString("PRODUCT");
    switch (PRODUCT_STRING) {
    case "Laptops":
        catalog = ShoppingCartHelper.getLaptopCatalog(getResources())
        break;
    case "Phones":
        catalog = ShoppingCartHelper
                .gePhonesCatalog(getResources());
        break;
    }
    final Product selectedProduct=(Product)this.catalog.get(productIndex);
// this declaration of product is taken as a new entry......................        
    ImageView productImageView = (ImageView) findViewById(R.id.ImageViewProduct);

    productImageView.setImageDrawable(selectedProduct.productImage);    TextView productTitleTextView = (TextView)findViewById(R.id.TextViewProductTitle);

    productTitleTextView.setText(selectedProduct.title);

    TextView productDetailsTextView = (TextView) findViewById(R.id.TextViewProductDetails);

    productDetailsTextView.setText(selectedProduct.description);

    final Button addToCartButton = (Button) findViewById(R.id.ButtonAddToCart);

    addToCartButton.setOnClickListener(new OnClickListener() {
        @Override

        public void onClick(View v) {
            cart.add(selectedProduct);
                selectedProduct.quantity ++;
            finish();
        }
    });     
    if(cart.contains(selectedProduct)) {
           addToCartButton.setEnabled(false);
           addToCartButton.setText("Item in Cart");
    }       
}

【问题讨论】:

  • 如何保存添加的项目?使用数据库?
  • 我认为这里的问题与购物车中的Product 与您执行cart.contains(selectedProduct) 时执行的目录中的“产品”之间的比较有关。您如何将商品添加到购物车?您是否期望它们是相同的实际对象?如果您允许指定数量,这似乎不太可能。也许您需要编写一些代码来确定匹配,而不是让 List 对 2 个对象执行相等比较。
  • 其实我假设可以从这一行获得相同的产品 final Product selectedProduct=(Product)this.catalog.get(productIndex);我没有使用数据库。只是一个类来动态添加项目
  • 是的,但是当您将产品添加到购物车时,您会添加什么,当您从目录中获取产品时,您会得到什么。除非您正在处理相同的实际 java 对象。检查 for.contains 将失败。即。
  • 那么获得相同对象的方法是什么......并避免新创建??

标签: java android shopping-cart


【解决方案1】:

最快的解决方法是覆盖项目的equals()

否则,从 Java 的角度来看,您的项目的每个实例都将被视为(并且真的)不同的。

你可以这样做:

// Somewhere in your item's class..

@Override
public boolean equals(Object o) {
    if(!(o instanceof YourItem)
        return false;
    YourItem i = (YourItem) o;
    // This line below is based on my assumption, you should change to better suit your usecase.
    return this.getItemId() == i.getItemId();
}

当然,在上面的代码中,我假设您的项目有一个项目 ID 字段和一个获取它的 getter 方法。请注意,它可能不适合您,您可能需要对其进行一些调整。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多