git代碼跳轉 https://github.com/RadinLy/ShopCartdDmo
如何避免這兩種控件的復用,1,把Checkbox加入到Map集合中,通過Map集合對控件進行操作,2,把每個條目布局中的商品數量加入到Bean類中。
checkbox加入到map中有何好處,首先,你購物車不可能是只是在adapter中記錄選中消息,你activity中可能會存在全選操作,那么,你在Activity中如何快速修改全部的選中狀態,那么就直接循環一下map集合,并刷新adapter,就可以完成。
條目布局中的數量加入到Bean類,傳遞到下一個訂單支付界面,可以直接通過Bean類傳遞一個序列化類,就不會做太多的循環查詢數據操作了。
接下來是
不詳細解釋原因,場景: 購物車
KXWH5TVFD11X@2Z27U0UCEL.png
復用的可能不止一個Checkbox,還有選擇商品數量的TextView,
具體如何避免,如下
1.給CheckBox創建一個Map集合,把商品數量放入Bean類中
//創建Checkbox集合
private Map<Integer, Boolean> map = new HashMap<>();
2.創建子線程,接收商品數量改變等操作
//創建子線程,根據適配器中加減點擊按鈕傳遞給主界面
Handler mHandler = new Handler() {
public void handleMessage( Message msg) {
switch (msg.what) {
case 100://減 購物車商品數量修改
// httpList();
CartLstBean cart = (CartLstBean) msg.obj;
httpChangeNum(cart.getGoodid(), cart.getType(), cart.getShop_id(), cart.getId(), cart.getNum());
break;
case 200://加 購物車商品數量修改
CartLstBean carta = (CartLstBean) msg.obj;
httpChangeNum(carta.getGoodid(), carta.getType(), carta.getShop_id(), carta.getId(), carta.getNum());
break;
case 300:
ChangeMoney();
break;
case 400://購物車商品刪除
final CartLstBean cartd = (CartLstBean) msg.obj;
new AlertStyleDialog(getActivity(), "", "確認刪除該商品?", true, 0, new AlertStyleDialog.OnDialogButtonClickListener() {
@Override
public void onDialogButtonClick(int requestCode, boolean isPositive) {
if (isPositive) {
httpDelCart(cartd.getGoodid(), cartd.getType(), cartd.getShop_id(), cartd.getId());
}
}
}).show();
break;
}
}
};
//初始化適配器,根據自己創建適配器進行相應修改
AdapterUtil adapterUtil = new AdapterUtil<>();
mAdapter = adapterUtil.getCartLstAdapter(getActivity(), mList, mHandler, map);
lvDisplay.setAdapter(mAdapter);
3.接下來就是適配器中的相應操作,
/**
* 商品評論列表
*/
public QuickAdapter<T> getCartLstAdapter(final Activity activity, List<T> list, final Handler handler, final Map<Integer, Boolean> map) {
return new QuickAdapter<T>(activity, R.layout.item_cartlst, list) {
@Override
protected void convert(final BaseAdapterHelper helper, T item) {
final CartLstBean o = (CartLstBean) item;
//刪除商品按鈕
ImageView del = (ImageView) helper.getView().findViewById(R.id.cartlst_del);
del.setTag(helper.getPosition());//設置標簽
//數量
final TextView tvHasNum = (TextView) helper.getView().findViewById(R.id.tv_has_num);
//減
final TextView tvSubtract = (TextView) helper.getView().findViewById(R.id.tv_subtract);
tvSubtract.setTag(helper.getPosition());//設置標簽
//加
final TextView tvAdd = (TextView) helper.getView().findViewById(R.id.tv_add);
tvAdd.setTag(helper.getPosition());
//根據網絡請求獲取到商品數量,判斷減號按鈕是否顯示亮色
if (NumUtil.getInt(GetTextForViewUtil.getText(tvHasNum)) <= 1) {
tvHasNum.setText("1");
tvHasNum.setEnabled(false);
Drawable drawable = activity.getResources().getDrawable(R.mipmap.btn_subtract_normal);
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); //設置邊界
tvSubtract.setCompoundDrawables(null, null, drawable, null);//畫在右邊
tvSubtract.setPadding(0, 0, 14, 0);
} else {
Drawable drawable = activity.getResources().getDrawable(R.mipmap.btn_subtract_pressed);
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); //設置邊界
tvSubtract.setPadding(20, 0, 0, 0);
tvSubtract.setCompoundDrawables(drawable, null, null, null);//畫在左邊
}
//Checkbox按鈕
CheckBox choose = (CheckBox) helper.getView().findViewById(R.id.check_quanxuan);
choose.setTag(helper.getPosition());//設置標簽
//根據傳遞進來的map集合判斷當前position的item是否為選中
boolean isCheck = map.get(helper.getPosition()) == null ? false : map.get(helper.getPosition());
choose.setChecked(isCheck);
//接下來就是Checkbox的選中事件了
choose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//根據之前設置的標簽,來獲取到點擊事件選中的是第幾個item
int pos = (int) v.getTag();
boolean isCheck;
isCheck = map.get(pos) == null ? false : map.get(pos);//獲取當前item的選中狀態
if (!isCheck) {//如果是未選中,則在map集合中加入當前position中的item為選中
map.put(pos, true);
} else {//如果是已選中,則去除map集合中的當前位置選中狀態
map.remove(pos);
}
//像view界面傳遞消息,修改金額已經刷新適配器
handler.sendEmptyMessageDelayed(300, 0);
notifyDataSetChanged();
}
});
tvSubtract.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Message msg = new Message();
if (Integer.parseInt(v.getTag() + "") == helper.getPosition()) {
tvHasNum.setText((NumUtil.getInt(GetTextForViewUtil.getText(tvHasNum)) - 1) + "");
if (NumUtil.getInt(GetTextForViewUtil.getText(tvHasNum)) < 1) {
msg.what = 400;
tvHasNum.setText("1");
tvHasNum.setEnabled(false);
Drawable drawable = activity.getResources().getDrawable(R.mipmap.btn_subtract_normal);
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); //設置邊界
tvSubtract.setCompoundDrawables(null, null, drawable, null);//畫在右邊
tvSubtract.setPadding(0, 0, 14, 0);
} else {
Drawable drawable = activity.getResources().getDrawable(R.mipmap.btn_add_pressed);
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); //設置邊界
tvAdd.setCompoundDrawables(drawable, null, null, null);//畫在左邊
msg.what = 100;
}
}
//設置金額傳入bean類中
o.setNum(GetTextForViewUtil.getText(tvHasNum));
msg.obj = o;
//點擊一次按鈕,發送一次消息給view,并刷新金額
handler.sendMessage(msg);
}
});
tvAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tvHasNum.setText((NumUtil.getInt(GetTextForViewUtil.getText(tvHasNum)) + 1) + "");
if (NumUtil.getInt(GetTextForViewUtil.getText(tvHasNum)) > 1) {
tvHasNum.setEnabled(true);
Drawable drawable = activity.getResources().getDrawable(R.mipmap.btn_subtract_pressed);
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); //設置邊界
tvSubtract.setCompoundDrawables(null, null, drawable, null);//畫在右邊
tvSubtract.setPadding(0, 0, 14, 0);
}
o.setNum(GetTextForViewUtil.getText(tvHasNum));
Message msg = new Message();
msg.what = 200;
msg.obj = o;
handler.sendMessage(msg);
}
});
del.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (Integer.parseInt(view.getTag() + "") == helper.getPosition()) {
Message msg = new Message();
msg.what = 400;
msg.obj = o;
handler.sendMessage(msg);
}
}
});
}
};
}
主要代碼就如上所示,解決如上問題,這些代碼也就足夠了。
喜歡的話點個贊,謝謝