購物車(Android)

最近遇到一個項目需要寫一個購物車功能匹厘,之前也沒寫過屯蹦,看別人大多都是利用Handler實現(xiàn)全選维哈、單選绳姨、修改數(shù)量時即時刷新總價;現(xiàn)在我直接調(diào)用方法來實現(xiàn)(其實思路是類似的)阔挠。

購物車效果圖(由于筆者發(fā)帖不多飘庄,暫時還不會制作成動圖展示):

購物車效果圖

下圖是購物車的需求:


購物車需求

1、首先在Activity中聲明一個List保存從服務器請求回來的數(shù)據(jù)

private List<Shopping> shoppingList = new ArrayList<>();

2谒亦、然后在購物車的實體類(Shopping)中加入一個字段“checks”用來記錄每一條數(shù)據(jù)是否選中的狀態(tài)

private boolean checks;
public boolean isChecks() {    
    return checks;
}
public void setChecks(boolean checks) {
    this.checks = checks;
}

3竭宰、既然無論是點擊item的CheckBox或加、減按鈕份招,還是點擊Activity中的全選切揭,都是Activity中的合計價格發(fā)生變化,那么我就在Activity中寫一個方法锁摔,處理item中的點擊事件廓旬,在Adapter中調(diào)用該方法即可。

/**
 * 選中谐腰,加減方法
 * @param checks 是否被選中
 * @param count 被選中的商品id
 * @param number 被選中商品的數(shù)量
 */
public void UpView(boolean checks, int count,int number){
    double AllPrice = 0;
    int size = 0 ;//用來計數(shù)孕豹,判斷數(shù)據(jù)是否被全部選中
    for (Shopping shop:shoppingList) {
        if(shop.p_id == count){//查找被選中商品id
            shop.setChecks(checks);//改變商品集合shoppingList中的選中狀態(tài)
            shop.p_number = number;//同時修改商品數(shù)量
        }
        if(shop.isChecks()){//判斷商品是否被選中,如被選中計算價格
            size++;
            AllPrice =AllPrice + Double.valueOf(shop.p_price) * shop.p_number;//得到被選中商品的總價格
        }
    }
    shopAdapter.clear();
    shopAdapter.addItem(shoppingList);
    shopAdapter.notifyDataSetChanged();
    prices.setText("¥"+AllPrice);//顯示總價
    if(size == shoppingList.size()){
        all_checks.setChecked(true);//是全部被選中十气,改變?nèi)xcheck狀態(tài)為選中
    }else{
        a = 1;//a=1表示all_checks監(jiān)聽中方法不執(zhí)行
        if(!all_checks.isChecked()) a=0;//all_checks未被選中給a賦值0讓all_checks的監(jiān)聽中的方法繼續(xù)執(zhí)行
        all_checks.setChecked(false);//不是励背,繼續(xù)維持未選中狀態(tài)
    }
}

4、接下來就是Adapter中調(diào)用砸西,調(diào)用很簡單:

//選中監(jiān)聽
holder.checks.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            mainActivity.UpView(isChecked, shopping.p_id, shopping.p_number);
    }
});
//數(shù)量減
holder.minus.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        int minus = 0;//新數(shù)量
        if(shopping.p_number>1) {
            minus = shopping.p_number-1;
            mainActivity.UpView(shopping.isChecks(), shopping.p_id, minus);
        }else{
            Toast.makeText(context,"數(shù)量不能再少了",Toast.LENGTH_SHORT).show();
        }
    }
});
//數(shù)量加
holder.add.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       mainActivity.UpView(shopping.isChecks(),shopping.p_id,(shopping.p_number+1));
    }
});

5叶眉、此時Adapter中的監(jiān)聽已經(jīng)處理完了,接下來是Activity中全選(CheckBox)的監(jiān)聽:

/**
 * 全選check監(jiān)聽
 */
public void AllChecks(){
    all_checks.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if(b==0){
                a=0;b=1;
            }
            if(a==0) {//解決單選與全選沖突
                if (isChecked) {//true:全選被選中芹枷,false:全選取消
                    double AllPrice = 0;
                    for (Shopping shop : shoppingList) {
                        shop.setChecks(true);//改變商品選中狀態(tài)                        AllPrice = AllPrice + Double.valueOf(shop.p_price) * shop.p_number;//計算商品總價
                    }
                    prices.setText("¥" + AllPrice);//顯示總價
                } else {
                    b=0;
                    for (Shopping shop : shoppingList) {
                        shop.setChecks(false);//改變商品未選中狀態(tài)
                    }
                    prices.setText("¥0.0");//價格改為0
                }
                shopAdapter.clear();
                shopAdapter.addItem(shoppingList);//添加改編后的數(shù)據(jù)到list的Adapter
                shopAdapter.notifyDataSetChanged();//刷新列表
            }
            a=0;
        }
    });
}

6衅疙、至此,購物車的主要功能已經(jīng)實現(xiàn)鸳慈,接下來就是結(jié)算饱溢、刪除以及數(shù)量不能小于1的判斷:
注意:因為結(jié)算和刪除方法類似,這里只貼結(jié)算的代碼走芋;

/**
 * 結(jié)算方法
 */public void Settlement(){
    List<Integer> settlement_list = new ArrayList<>();
    final List<Shopping> new_list = new ArrayList<>();
    for (Shopping shop:shoppingList) {
        if(shop.isChecks()){
            settlement_list.add(shop.p_id);//取出被選中商品id加入新的list準備掉接口完成結(jié)算
        }else{
            new_list.add(shop);//剩余商品形成新的購物車列表等待顯示
        }
    }
    if(settlement_list.size()==0){
        Toast.makeText(MainActivity.this,"請選中至少一個商品后在結(jié)算",Toast.LENGTH_SHORT).show();
        return;
    }
    AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
    dialog.setTitle("提示").setMessage("總共"+settlement_list.size()+"個商品绩郎,共"+prices.getText().toString()+"元,是否要結(jié)算翁逞?");
    dialog.setPositiveButton("確定", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) { 
           //在這里調(diào)結(jié)算接口把settlement_list傳給后臺
            shoppingList = new_list;
            shopAdapter.clear();
            shopAdapter.addItem(shoppingList);
            shopAdapter.notifyDataSetChanged();
            prices.setText("¥0.0");
            dialog.cancel();
        }
    }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    }).create().show();
}

詳細代碼請看:
http://blog.csdn.net/qq_24544019/article/details/53156768
源碼下載http://pan.baidu.com/s/1eSkK12a
好了肋杖,以上就是筆者實現(xiàn)的購物車功能,歡迎各位讀者評論提問熄攘,O(∩_∩)O謝謝兽愤!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子浅萧,更是在濱河造成了極大的恐慌逐沙,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洼畅,死亡現(xiàn)場離奇詭異吩案,居然都是意外死亡影钉,警方通過查閱死者的電腦和手機顶瞳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妒蔚,“玉大人丧肴,你說我怎么就攤上這事残揉。” “怎么了芋浮?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵抱环,是天一觀的道長。 經(jīng)常有香客問我纸巷,道長镇草,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任瘤旨,我火速辦了婚禮梯啤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘存哲。我一直安慰自己因宇,他們只是感情好,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布宏胯。 她就那樣靜靜地躺著羽嫡,像睡著了一般本姥。 火紅的嫁衣襯著肌膚如雪肩袍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天婚惫,我揣著相機與錄音氛赐,去河邊找鬼。 笑死先舷,一個胖子當著我的面吹牛艰管,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒋川,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼牲芋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缸浦,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤夕冲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后裂逐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歹鱼,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年卜高,在試婚紗的時候發(fā)現(xiàn)自己被綠了弥姻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡掺涛,死狀恐怖庭敦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情薪缆,我是刑警寧澤螺捐,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站矮燎,受9級特大地震影響定血,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诞外,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一澜沟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧峡谊,春花似錦茫虽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至啥纸,卻和暖如春号杏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背斯棒。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工盾致, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荣暮。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓庭惜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親穗酥。 傳聞我的和親對象是個殘疾皇子护赊,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

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