ListView中CheckBox如何避免復用,購物車界面

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);
                        }
                    }
                });
            }
        };
    }

主要代碼就如上所示,解決如上問題,這些代碼也就足夠了。
喜歡的話點個贊,謝謝

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容