購物車-----ListView 中CheckBox混亂
阿新 • • 發佈:2018-11-21
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;
}
}
};