Demo:https://github.com/SunnyLine/NewShopCart/tree/master/MyApplication
这里只是购物车页面,地址管理,和订单生成都没有添加。主要处理ListView中CheckBox混乱问题,商品删除,数量增减,全选,取消全选,等。代码如下:
Adapter ,用Map记住CheckBox状态和CheckBox标记信息
public void init() {
bean = mList.get(position);
tvGoodNum.setText(String.valueOf(bean.number));
tvMedicineName.setText(bean.name);
tvMedicineInfo.setText(bean.describe);
tvGoodNum.setText(String.valueOf(bean.number));
tvMedicinePrice.setText(getString(R.string.price, String.valueOf(bean.price)));
ImageLoader.getInstance().displayImage(bean.img, imgIcon, options, listener);
cbItem.setOnCheckedChangeListener(this);
imgCartAdd.setOnClickListener(this);
imgCartDel.setOnClickListener(this);
imgCartCut.setOnClickListener(this);
boolean b = isSelected.get(bean) != null && isSelected.get(bean) ? true : false;
cbItem.setChecked(b);
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
isSelected.put(bean, isChecked);
handler.sendEmptyMessage(1);
} else if (isSelected.containsKey(bean) && !isChecked) {
isSelected.remove(bean);
handler.sendEmptyMessage(1);
}
}
Item 加减商品数量,删除商品
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.imgCartCut:
if (bean.number > 1) {
bean.number--;
}
tvGoodNum.setText(String.valueOf(bean.number));
handler.sendEmptyMessage(0);
break;
case R.id.imgCartAdd:
bean.number++;
tvGoodNum.setText(String.valueOf(bean.number));
handler.sendEmptyMessage(0);
break;
case R.id.imgCartDel:
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setMessage("确定要删除吗?").setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (isSelected.containsKey(bean)) {
isSelected.remove(bean);
}
mList.remove(bean);
notifyDataSetChanged();
handler.sendEmptyMessage(0);
}
}).show();
break;
}
}
Handler 计算商品合计(选中的商品)
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
cbSelectAll.setChecked(isSelected.size() == mList.size());
case 0:
float total = 0f;
Iterator<Map.Entry<MedicineBean, Boolean>> iterator = isSelected.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<MedicineBean, Boolean> entry = iterator.next();
MedicineBean b = entry.getKey();
total += b.number * b.price;
}
tvTotal.setText(getString(R.string.total, String.format("%.2f", total)));
break;
}
}
};