商城项目实战 | 14.2 仿京东购物车的实现(二)

本文为菜鸟窝作者刘婷的连载。”商城项目实战”系列来聊聊仿”京东淘宝的购物商城”如何实现。

在上一篇文章《商城项目实战 | 14.1 仿京东购物车的实现(一)》中已经实现了购物车模块商品列表的显示,那么下面我们要实现的就是购物车中商品的选择、商品合计以及商品的编辑模式和完成模式的切换,效果图还是要先看看。

效果图
效果图

这是编辑模式的时候的界面,对比之前的完成模式下的界面,首先上面的“编辑”文字变成了“完成”,其次下面的“去结算”按钮变为了“删除”按钮了,也没有合计。不过模式的切换是最后一步,先来实现商品的选择效果吧。

实现购物车商品选中效果

购物车的商品选中有几个要点,第一每项商品 item 中都有一个 checkbox,而最底部还有一个全选的 checkbox,当所有的商品都选中时,全选按钮要处于选中状态,而当商品列表中有一个商品未选中时,全选按钮处于未选中状态,第二就是当全选按钮选中时,所有商品都要选中,当全选按钮不被选中时,所有商品都要取消选中。这么一大段话,理解起来可能不太容易,但是实现并不复杂。

1.实现商品项选中判断是否全选

首先来实现上文所说的第一种情况,通过商品列表 item 项的选中情况来判断全选按钮是否要选中,这里的实现都是在列表的 Adapter, CartAdapter 中实现的。

private void checkListen() {

        int count = 0;
        int checkNum = 0;
        if (datas != null) {
            count = datas.size();

            for (ShoppingCartInfo cart : datas) {
                if (!cart.isChecked()) {
                    checkBox.setChecked(false);
                    break;
                } else {
                    checkNum = checkNum + 1;
                }
            }

            if (count == checkNum) {
                checkBox.setChecked(true);
            }

        }
    }

checkbox 就是全选按钮,根据选中的商品数量是否等于总的商品数,如果等于的话,就要全选,不等于则是不全选,也就是全选按钮处于未选中状态。

2.实现全选判断商品是否要被选中

因为这里的全选按钮直接点击下就要使得选中按钮处于选中状态或者是未选中状态,所以就直接为 checkbox 全选按钮添加点击事件的监听。

checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                checkAll_None(checkBox.isChecked());
            }
        });

      public void checkAll_None(boolean isChecked){

        if(!isNull())
            return ;


        int i=0;
        for (ShoppingCartInfo cart :datas){
            cart.setIsChecked(isChecked);
            notifyItemChanged(i);
            i++;
        }

    }

checkAll_None(boolean isChecked) 根据 checkbox 全选按钮的状态来遍历所有的商品项,设置所有的商品项处于选中或未选中的状态。

实现商品合计

商品的合计是指对商品总价的计算,这要根据选中的不同商品的价格乘以数量来取得,所以这里也需要根据商品项的是否选中状态,商品的合计也可以放在 CartAdapter 中实现,和上文的商品选中效果一起处理。

public void showTotalPrice(){

        float total = getTotalPrice();

        textView.setText(Html.fromHtml("合计 ¥<span style='color:#eb4f38'>" + total + "</span>"), TextView.BufferType.SPANNABLE);
    }

private  float getTotalPrice(){
        float sum=0;
        if(!isNull())
            return sum;

        for (ShoppingCartInfo cart:
                datas) {
            if(cart.isChecked())
                sum += cart.getCount()*cart.getPrice();
        }

        return sum;
    }

getTotalPrice() 方法是根据商品项中所选中商品的数量乘以价格来计算获得总价,然后在 showTotalPrice() 中调用 getTotalPrice() 直接取得总价,最后显示在合计的 TextView 上。

实现编辑模式和完成模式的切换

购物车模块中有编辑模式和完成模式两种,编辑模式的时候可以对商品进行删除,而在完成模式时就可以去结算了,完成模式已经基本实现了,下面来主要实现编辑模式以及两种模式之间的切换。

1.实现编辑模式

编辑模式的时候有个删除按钮,简单起见,就直接在之前定义好的布局文件中添加一个删除的按钮。

<Button
            android:id="@+id/cart_btn_del"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:visibility="gone"
            android:minHeight="40dp"
            android:minWidth="80dp"
            android:text="@string/delete"
            style="@style/bigRedButton"/>

删除按钮写好了,下面就是删除商品的操作了,为删除按钮添加监听事件。


    button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               delCart();
            }
        });
   public void delCart(){

        if(!isNull())
            return ;
        for(Iterator iterator = datas.iterator(); iterator.hasNext();){

            ShoppingCartInfo cart = (ShoppingCartInfo) iterator.next();
            if(cart.isChecked()){
                int position = datas.indexOf(cart);
                cartProvider.delete(cart);
                iterator.remove();
                notifyItemRemoved(position);
            }

        }
    }

判断商品项是否被选中,如果被选中了,就要进行移除的操作,也就是删除了。

2.实现编辑模式和完成模式的切换

2.1 添加区分标志

模式的切换,自然要有一个标志来区分是编辑模式,还是完成模式,这里定义两个 int 类型的标志。

public static final int ACTION_EDIT=1;
public static final int ACTION_CAMPLATE=2;

ACTION_EDIT 表示编辑模式,ACTION_CAMPLATE 表示的则是完成模式。

2.2 添加事件监听

无论是编辑模式还是完成模式的显示,这些都要在顶部的右侧按钮点击时触发,所以为右侧按钮添加监听事件。

 btnEdit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
              int action = (int) v.getTag();
            if(ACTION_EDIT == action){

                //切换完成模式
            }
            else if(ACTION_CAMPLATE == action){

                //切换编辑模式
            }
            }
        });

右侧按钮的点击事件监听要根据当前的模式来区分,如果是编辑模式,则要进入完成模式,如果是完成模式则要进入编辑模式。

2.3 切换为编辑模式

界面的初始状态是完成模式,所以在初始化的时候不要忘记了设置初始为完成模式。

btnEdit.setTag(ACTION_CAMPLATE);

这时候点击右侧按钮就要进入到编辑模式中,先来实现完成模式的切换。

 private void showDelControl(){
        mToolbar.getRightButton().setText("完成");
        mTextTotal.setVisibility(View.GONE);
        mBtnOrder.setVisibility(View.GONE);
        mBtnDel.setVisibility(View.VISIBLE);
        mToolbar.getRightButton().setTag(ACTION_EDIT);

        mAdapter.checkAll_None(false);
        mCheckBox.setChecked(false);
    }

切换为完成模式,右侧按钮文本为“完成”,合计和结算要隐藏,删除按钮要显示,修改目前的模式为编辑模式,同时不要选中任意商品,并且全选也不能被选中。

2.4 切换为完成模式

切换到完成模式的处理和切换到编辑模式的处理类似,也是写在一个方法里面,不过是 hideDelControl() 方法。

 private void  hideDelControl(){

        mTextTotal.setVisibility(View.VISIBLE);
        mBtnOrder.setVisibility(View.VISIBLE);


        mBtnDel.setVisibility(View.GONE);
        mToolbar.setRightButtonText("编辑");
        mToolbar.getRightButton().setTag(ACTION_CAMPLATE);

        mAdapter.checkAll_None(true);
        mAdapter.showTotalPrice();

        mCheckBox.setChecked(true);
    }

切换为编辑模式,右侧按钮文本为“编辑”,合计和结算要显示,删除按钮要隐藏,修改目前的模式为完成模式,所有商品都要被选中。

效果图

运行最终代码获取到效果图。

效果图
效果图

到这里,仿京东购物车模块的基本功能就都已经实现了。

撸这个项目的一半,你就是大神 , 戳http://mp.weixin.qq.com/s/ZagocTlDfxZpC2IjUSFhHg

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容