You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android电商APP购物车重复添加问题求助:未操作却重复出现商品

问题原因分析

你遇到的问题核心在于每次进入CartdetailsActivity时,onCreate方法都会强制执行添加商品的逻辑,再加上cartItems是静态集合(不会随Activity销毁而清空),所以每次返回再进入购物车页面,都会往购物车里重复添加同一个商品。

看你代码里的CartdetailsActivity,在onCreate方法末尾,不管有没有点击过add_to_cart按钮,只要打开这个页面就会执行:

CartItem item = new CartItem(prodlabel, procost, proimag, seller_nam, prod_id);
cartItems.add(item);
cartAdapter.notifyDataSetChanged();

这就导致每次进入购物车页面,都会自动塞一个商品进去,哪怕你只是返回再打开。

解决方案

我们需要把「添加商品」的逻辑从购物车页面移到**add_to_cart按钮的点击事件中**,购物车页面只负责展示已有的购物车数据,这样就能避免重复添加的问题。

步骤1:把添加商品的逻辑移到商品详情页

找到你有add_to_cart按钮的商品详情页面,在按钮点击事件里完成商品添加操作,同时加入重复判断避免同一商品多次添加:

// 商品详情页的add_to_cart按钮点击事件
add_to_cart.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 获取当前商品的信息(和你之前在购物车页取的逻辑一致)
        SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref5", 0);
        int prod_id = pref.getInt("productid", 0);
        String prodlabel = pref.getString("shop_name", " ");
        int procost = pref.getInt("cost", 0);
        String proimag = pref.getString("img", " ");
        
        SharedPreferences pref1 = getApplicationContext().getSharedPreferences("sellername", 0);
        String seller_nam = pref1.getString("seller_name", " ");
        
        // 先判断购物车里是否已有该商品
        boolean isItemExist = false;
        for (CartItem item : CartdetailsActivity.cartItems) {
            if (item.getProd_id() == prod_id) {
                isItemExist = true;
                break;
            }
        }
        
        if (!isItemExist) {
            // 没有重复才添加
            CartItem newItem = new CartItem(prodlabel, procost, proimag, seller_nam, prod_id);
            CartdetailsActivity.cartItems.add(newItem);
            Toast.makeText(getApplicationContext(), "商品已加入购物车", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(getApplicationContext(), "该商品已经在购物车里啦", Toast.LENGTH_SHORT).show();
        }
    }
});

步骤2:修改购物车页面的onCreate方法

把原来onCreate末尾的添加商品代码删掉,购物车页面只负责初始化和展示已有数据:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cartdetails);
    // 保留原来的Toolbar初始化、控件绑定、SharedPreferences读取等代码
    
    // 删掉下面这两行强制添加商品的代码!!!
    // CartItem item = new CartItem(prodlabel, procost, proimag, seller_nam, prod_id);
    // cartItems.add(item);
    
    cartAdapter.notifyDataSetChanged();
}

步骤3:优化购物车页面的刷新逻辑

在onResume里完善购物车数量的显示(把你之前注释掉的代码启用):

@Override
protected void onResume () {
    super.onResume();
    addtocart.setAdapter(cartAdapter);
    cartAdapter.notifyDataSetChanged();
    // 更新购物车数量文本
    int itemCount = cartAdapter.getCount();
    cartcount.setText("You have " + itemCount + " product" + (itemCount > 1 ? "s" : "") + " in cart");
}
额外小建议
  • 尽量别用静态集合存储购物车数据,静态数据会一直占用内存,还可能引发内存泄漏。可以试试用SharedPreferences序列化存储,或者用Room本地数据库做持久化。
  • 购物车的总价计算、数量统计这类逻辑,建议放到Adapter或者专门的工具类里,别让Activity承担太多业务代码。

内容的提问来源于stack exchange,提问作者Facts Guru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 15:27:37