Android批发应用开发:如何重置item_quantity等变量至默认值?
解决批发应用中商品属性重置与重复订单问题
我是一名大二IT专业学生,正在开发一款批发应用。应用运行流程如下:
用户首先浏览店铺中的商品,选中商品的数据会被用于创建对象,该对象会被添加至作为用户购物车的ArrayList中。此ArrayList及其实时数据可在Cart页面和Receipt/Checkout页面查看。
点击Receipt页面的OK按钮会复制该ArrayList,将副本存储至订单历史中,最后清空原ArrayList并返回主菜单。
问题现象
- 修改商品颜色后点击按钮会创建重复订单
- 二次添加商品时,会出现
quantity为0的无效商品,且需多次点击才能更新计数器 - 点击
shirtBTN或shortsBTN后,重置item_quantity、item_color、item_type的操作未生效,新对象会继承旧属性
问题根源
- 把商品属性定义为Activity成员变量,生命周期与Activity绑定,一旦控件读取逻辑出错(比如未选中颜色、数量输入异常),就会复用旧值
getQuantity_Sum方法循环条件错误:i < cart.size() && cart.get(i).GETtype_listitem().equals(type)会在遇到非目标类型商品时直接终止循环,无法统计所有同类型商品的数量总和- 不必要的
volatile修饰符可能引发内存可见性问题,且这些变量仅在UI线程操作,完全不需要该修饰
解决方案
1. 改用局部变量(最推荐,彻底避免旧值复用)
把item_quantity、item_color、item_type从Activity成员变量改为按钮点击事件内的局部变量,每次点击都会重新初始化变量:
修改shirtBTN点击逻辑:
shirtBTN.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { final Chip tempCHIP; final int tempCOLOR; final float item_cost; // 局部变量,每次点击重新创建 int item_quantity; String item_color; String item_type; // 校验颜色选择 tempCOLOR = colorCG.getCheckedChipId(); if (tempCOLOR == View.NO_ID) { Toast.makeText(getApplicationContext(), "请选择颜色", Toast.LENGTH_SHORT).show(); return; } tempCHIP = findViewById(tempCOLOR); item_color = tempCHIP.getText().toString(); // 校验数量输入 try { item_quantity = Integer.parseInt(quantityCOUNTER.getText().toString()); if (item_quantity < 1) { Toast.makeText(getApplicationContext(), "数量不能小于1", Toast.LENGTH_SHORT).show(); quantityCOUNTER.setText("1"); return; } } catch (NumberFormatException e) { Toast.makeText(getApplicationContext(), "请输入有效数量", Toast.LENGTH_SHORT).show(); quantityCOUNTER.setText("1"); return; } item_type = "SHIRT"; item_cost = item_quantity * 150; checkoutSTRUCT.add(new listitem(item_quantity, item_color, item_type, item_cost)); Toast.makeText(getApplicationContext(), getCount(checkoutSTRUCT, item_type) + " " + item_type, Toast.LENGTH_SHORT).show(); shirtCOUNTER.setText(String.valueOf(getQuantity_Sum(checkoutSTRUCT, item_type))); // 局部变量无需手动重置,方法结束后自动销毁 } });
同理修改shortsBTN的点击逻辑,将相关变量改为局部变量并增加校验。
2. 修复getQuantity_Sum方法
原方法无法统计所有同类型商品,修改为:
private int getQuantity_Sum(ArrayList<listitem> cart, String type){ int tempSum= 0; for (int i = 0; i < cart.size(); i++) { // 遍历所有商品,匹配类型后累加数量 if (cart.get(i).GETtype_listitem().equals(type)) { tempSum += cart.get(i).GETqty_listitem(); } } return tempSum; }
3. 优化成员变量重置逻辑(若坚持使用成员变量)
如果一定要保留成员变量,每次点击前先强制重置,并增加输入校验:
shirtBTN.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 先强制重置成员变量 item_quantity = empty_INT; item_color = empty_STR; item_type = empty_STR; final Chip tempCHIP; final int tempCOLOR; final float item_cost; // 颜色选择校验 tempCOLOR = colorCG.getCheckedChipId(); if (tempCOLOR == View.NO_ID) { Toast.makeText(getApplicationContext(), "请选择颜色", Toast.LENGTH_SHORT).show(); return; } tempCHIP = findViewById(tempCOLOR); item_color = tempCHIP.getText().toString(); // 数量输入校验 try { item_quantity = Integer.parseInt(quantityCOUNTER.getText().toString()); if (item_quantity < 1) { Toast.makeText(getApplicationContext(), "数量不能小于1", Toast.LENGTH_SHORT).show(); quantityCOUNTER.setText("1"); return; } } catch (NumberFormatException e) { Toast.makeText(getApplicationContext(), "请输入有效数量", Toast.LENGTH_SHORT).show(); quantityCOUNTER.setText("1"); return; } item_type = "SHIRT"; item_cost = item_quantity * 150; checkoutSTRUCT.add(new listitem(item_quantity, item_color, item_type, item_cost)); Toast.makeText(getApplicationContext(), getCount(checkoutSTRUCT, item_type) + " " + item_type, Toast.LENGTH_SHORT).show(); shirtCOUNTER.setText(String.valueOf(getQuantity_Sum(checkoutSTRUCT, item_type))); // 再次重置成员变量 item_quantity = empty_INT; item_color = empty_STR; item_type = empty_STR; } });
额外优化建议
- 移除成员变量的
volatile修饰符,这些变量仅在UI线程操作,不需要内存可见性保障 - 对颜色、数量等输入项增加必填校验,避免无效数据进入购物车
- 考虑将购物车逻辑封装为独立的
CartManager类,替代静态ArrayList,提升代码可维护性
内容的提问来源于stack exchange,提问作者disarm9
相关产品推荐
相关产品推荐

