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
相关产品推荐
相关产品推荐

