ListView中CheckBox如何避免復(fù)用,購(gòu)物車(chē)界面

git代碼跳轉(zhuǎn) https://github.com/RadinLy/ShopCartdDmo

如何避免這兩種控件的復(fù)用讼庇,1灸拍,把Checkbox加入到Map集合中做祝,通過(guò)Map集合對(duì)控件進(jìn)行操作,2鸡岗,把每個(gè)條目布局中的商品數(shù)量加入到Bean類(lèi)中混槐。

checkbox加入到map中有何好處,首先轩性,你購(gòu)物車(chē)不可能是只是在adapter中記錄選中消息声登,你activity中可能會(huì)存在全選操作,那么,你在Activity中如何快速修改全部的選中狀態(tài)悯嗓,那么就直接循環(huán)一下map集合件舵,并刷新adapter,就可以完成。

條目布局中的數(shù)量加入到Bean類(lèi)脯厨,傳遞到下一個(gè)訂單支付界面铅祸,可以直接通過(guò)Bean類(lèi)傳遞一個(gè)序列化類(lèi),就不會(huì)做太多的循環(huán)查詢數(shù)據(jù)操作了合武。
接下來(lái)是
不詳細(xì)解釋原因临梗,場(chǎng)景: 購(gòu)物車(chē)


KXWH5TVFD11X@2Z27U0UCEL.png

復(fù)用的可能不止一個(gè)Checkbox,還有選擇商品數(shù)量的TextView稼跳,
具體如何避免盟庞,如下

1.給CheckBox創(chuàng)建一個(gè)Map集合,把商品數(shù)量放入Bean類(lèi)中

    //創(chuàng)建Checkbox集合
    private Map<Integer, Boolean> map = new HashMap<>();

2.創(chuàng)建子線程汤善,接收商品數(shù)量改變等操作

//創(chuàng)建子線程什猖,根據(jù)適配器中加減點(diǎn)擊按鈕傳遞給主界面
 Handler mHandler = new Handler() {
        public void handleMessage( Message msg) {

            switch (msg.what) {
                case 100://減  購(gòu)物車(chē)商品數(shù)量修改
                    //  httpList();
                    CartLstBean cart = (CartLstBean) msg.obj;
                    httpChangeNum(cart.getGoodid(), cart.getType(), cart.getShop_id(), cart.getId(), cart.getNum());
                    break;
                case 200://加  購(gòu)物車(chē)商品數(shù)量修改
                    CartLstBean carta = (CartLstBean) msg.obj;
                    httpChangeNum(carta.getGoodid(), carta.getType(), carta.getShop_id(), carta.getId(), carta.getNum());
                    break;
                case 300:
                    ChangeMoney();
                    break;
                case 400://購(gòu)物車(chē)商品刪除
                    final CartLstBean cartd = (CartLstBean) msg.obj;
                    new AlertStyleDialog(getActivity(), "", "確認(rèn)刪除該商品?", 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;
            }
        }
    };
        //初始化適配器,根據(jù)自己創(chuàng)建適配器進(jìn)行相應(yīng)修改
        AdapterUtil adapterUtil = new AdapterUtil<>();
        mAdapter = adapterUtil.getCartLstAdapter(getActivity(), mList, mHandler, map);
        lvDisplay.setAdapter(mAdapter);

3.接下來(lái)就是適配器中的相應(yīng)操作萎津,

 /**
     * 商品評(píng)論列表
     */
    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());//設(shè)置標(biāo)簽
                //數(shù)量
                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());//設(shè)置標(biāo)簽
                //加
                final TextView tvAdd = (TextView) helper.getView().findViewById(R.id.tv_add);
                tvAdd.setTag(helper.getPosition());
               //根據(jù)網(wǎng)絡(luò)請(qǐng)求獲取到商品數(shù)量卸伞,判斷減號(hào)按鈕是否顯示亮色
                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()); //設(shè)置邊界
                    tvSubtract.setCompoundDrawables(null, null, drawable, null);//畫(huà)在右邊
                    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()); //設(shè)置邊界
                    tvSubtract.setPadding(20, 0, 0, 0);
                    tvSubtract.setCompoundDrawables(drawable, null, null, null);//畫(huà)在左邊

                }
                 //Checkbox按鈕
                CheckBox choose = (CheckBox) helper.getView().findViewById(R.id.check_quanxuan);
                choose.setTag(helper.getPosition());//設(shè)置標(biāo)簽

                //根據(jù)傳遞進(jìn)來(lái)的map集合判斷當(dāng)前position的item是否為選中
                boolean isCheck = map.get(helper.getPosition()) == null ? false : map.get(helper.getPosition());
                choose.setChecked(isCheck);
                //接下來(lái)就是Checkbox的選中事件了
                choose.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                         //根據(jù)之前設(shè)置的標(biāo)簽,來(lái)獲取到點(diǎn)擊事件選中的是第幾個(gè)item
                        int pos = (int) v.getTag();
                        boolean isCheck;
                        isCheck = map.get(pos) == null ? false : map.get(pos);//獲取當(dāng)前item的選中狀態(tài)
                        if (!isCheck) {//如果是未選中锉屈,則在map集合中加入當(dāng)前position中的item為選中
                            map.put(pos, true);
                        } else {//如果是已選中荤傲,則去除map集合中的當(dāng)前位置選中狀態(tài)
                            map.remove(pos);
                        }
                      //像view界面?zhèn)鬟f消息,修改金額已經(jīng)刷新適配器
                        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()); //設(shè)置邊界
                                tvSubtract.setCompoundDrawables(null, null, drawable, null);//畫(huà)在右邊
                                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()); //設(shè)置邊界
                                tvAdd.setCompoundDrawables(drawable, null, null, null);//畫(huà)在左邊
                                msg.what = 100;
                            }
                        }
                       //設(shè)置金額傳入bean類(lèi)中
                        o.setNum(GetTextForViewUtil.getText(tvHasNum));

                        msg.obj = o;
                       //點(diǎn)擊一次按鈕颈渊,發(fā)送一次消息給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()); //設(shè)置邊界
                            tvSubtract.setCompoundDrawables(null, null, drawable, null);//畫(huà)在右邊
                            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);
                        }
                    }
                });
            }
        };
    }

主要代碼就如上所示,解決如上問(wèn)題俊嗽,這些代碼也就足夠了雾家。
喜歡的話點(diǎn)個(gè)贊,謝謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绍豁,一起剝皮案震驚了整個(gè)濱河市芯咧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌竹揍,老刑警劉巖敬飒,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異芬位,居然都是意外死亡无拗,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)昧碉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)英染,“玉大人揽惹,你說(shuō)我怎么就攤上這事∷目担” “怎么了搪搏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)箭养。 經(jīng)常有香客問(wèn)我慕嚷,道長(zhǎng)哥牍,這世上最難降的妖魔是什么毕泌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮嗅辣,結(jié)果婚禮上撼泛,老公的妹妹穿的比我還像新娘。我一直安慰自己澡谭,他們只是感情好愿题,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蛙奖,像睡著了一般潘酗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雁仲,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天仔夺,我揣著相機(jī)與錄音,去河邊找鬼攒砖。 笑死缸兔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吹艇。 我是一名探鬼主播惰蜜,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼受神!你這毒婦竟也來(lái)了抛猖?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鼻听,失蹤者是張志新(化名)和其女友劉穎财著,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體精算,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓢宦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灰羽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驮履。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鱼辙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玫镐,到底是詐尸還是另有隱情倒戏,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布恐似,位于F島的核電站杜跷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏矫夷。R本人自食惡果不足惜葛闷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望双藕。 院中可真熱鬧淑趾,春花似錦、人聲如沸忧陪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嘶摊。三九已至延蟹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叶堆,已是汗流浹背阱飘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹂空,地道東北人俯萌。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像上枕,于是被迫代替她去往敵國(guó)和親咐熙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容