仿购物车功能

我们平时在网上买东西 经常用到购物车功能,今天就简单写一下这个模块的一些基本功能,先附上两张效果图

            

 先介绍下基本功能:购物车里面有1-多个店铺,每个店铺里又可能有1-多件商品;在购物车里可以编辑每个店铺里的商品(包括增加和减少商品数量、删除购物车里的商品);结算的时候要选中要买的商品,同时自动计算总商品价格,在选择商品的时候可以勾选店铺,则此店铺下了商品全部选中,为了方便,如果购物车里商品全部购买,则可以选中 全选按钮,则所有店铺商品全部选中。

页面布局用到了ExpandableListView二级列表来展示店铺以及店铺下的商品。 编辑和正常状态切换不同布局来显示就可以了。

在adapter里面写了几个操作接口 ,方便编辑

/**
     * 店铺的复选框
     */
    public interface CheckInterface {
        /**
         * 组选框状态改变触发的事件
         *
         * @param groupPosition 组元素的位置
         * @param isChecked     组元素的选中与否
         */
        void checkGroup(int groupPosition, boolean isChecked);

        /**
         * 子选框状态改变触发的事件
         *
         * @param groupPosition 组元素的位置
         * @param childPosition 子元素的位置
         * @param isChecked     子元素的选中与否
         */
        void checkChild(int groupPosition, int childPosition, boolean isChecked);
    }

    /**
     * 改变数量的接口
     */
    public interface ModifyCountInterface {
        /**
         * 增加操作
         *
         * @param groupPosition 组元素的位置
         * @param childPosition 子元素的位置
         * @param showCountView 用于展示变化后数量的View
         * @param isChecked     子元素选中与否
         */
        void doIncrease(int groupPosition, int childPosition, View showCountView, boolean isChecked);

        void doDecrease(int groupPosition, int childPosition, View showCountView, boolean isChecked);

        void doUpdate(int groupPosition, int childPosition, View showCountView, boolean isChecked);

        /**
         * 删除子Item
         *
         * @param groupPosition
         * @param childPosition
         */
        void childDelete(int groupPosition, int childPosition);
    }

    /**
     * 监听编辑状态
     */
    public interface GroupEditorListener {
        void groupEditor(int groupPosition);
    }

    public CheckInterface getCheckInterface() {
        return checkInterface;
    }

    public void setCheckInterface(CheckInterface checkInterface) {
        this.checkInterface = checkInterface;
    }

    public GroupEditorListener getGroupEditorListener() {
        return groupEditorListener;
    }

    public void setGroupEditorListener(GroupEditorListener groupEditorListener) {
        this.groupEditorListener = groupEditorListener;
    }

    public ModifyCountInterface getModifyCountInterface() {
        return modifyCountInterface;
    }

    public void setModifyCountInterface(ModifyCountInterface modifyCountInterface) {
        this.modifyCountInterface = modifyCountInterface;
    }

adapter里面对组的操作

/**【文字指的是组的按钮的文字】
         * 当我们按下ActionBar的 "编辑"按钮, 应该把所有组的文字显示"编辑",并且设置按钮为不可见
         * 当我们完成编辑后,再把组的编辑按钮设置为可见
         * 不懂,请自己操作淘宝,观察一遍
         */
        if(storeInfoList.get(groupPosition).isActionBarEditor()){
            storeInfoList.get(groupPosition).setEditor(false);
            groupViewHolder.storeEdit.setVisibility(View.INVISIBLE);
            flag=false;
        }else{
            flag=true;
            groupViewHolder.storeEdit.setVisibility(View.VISIBLE);
        }

        /**
         * 思路:当我们按下组的"编辑"按钮后,组处于编辑状态,文字显示"完成"
         * 当我们点击“完成”按钮后,文字显示"编辑“,组处于未编辑状态
         */
        if (storeInfoList.get(groupPosition).isEditor()){
            groupViewHolder.storeEdit.setText("完成");
        }else {
            groupViewHolder.storeEdit.setText("编辑");
        }
        groupViewHolder.storeEdit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                groupEditorListener.groupEditor(groupPosition);
                if (storeInfoList.get(groupPosition).isEditor()){
                    storeInfoList.get(groupPosition).setEditor(false);
                }else {
                    storeInfoList.get(groupPosition).setEditor(true);
                }
                notifyDataSetChanged();
            }
        });

adapter里对子列表的操作

/**
         * 根据组的编辑按钮的可见与不可见,去判断是组对下辖的子元素编辑  还是ActionBar对组的下瞎元素的编辑
         * 如果组的编辑按钮可见,那么肯定是组对自己下辖元素的编辑
         * 如果组的编辑按钮不可见,那么肯定是ActionBar对组下辖元素的编辑
         */
        if (flag){//组的编辑按钮可见
            if (storeInfoList.get(groupPosition).isEditor()){//组对自己下辖元素的编辑
                childViewHolder.editGoodsData.setVisibility(View.VISIBLE);//编辑时布局显示
                childViewHolder.goodsDataNoedit.setVisibility(View.GONE);//未编辑时布局隐藏掉
            }else {
                childViewHolder.editGoodsData.setVisibility(View.GONE);//编辑时布局隐藏掉
                childViewHolder.goodsDataNoedit.setVisibility(View.VISIBLE);//未编辑时布局显示
            }
        }else {//组的编辑按钮不可见
            if(storeInfoList.get(groupPosition).isActionBarEditor()){
                childViewHolder.editGoodsData.setVisibility(View.VISIBLE);//编辑时布局显示
                childViewHolder.goodsDataNoedit.setVisibility(View.GONE);//未编辑时布局隐藏掉
            }else {
                childViewHolder.editGoodsData.setVisibility(View.GONE);//编辑时布局隐藏掉
                childViewHolder.goodsDataNoedit.setVisibility(View.VISIBLE);//未编辑时布局显示
            }
        }

        if (storeInfoList.get(groupPosition).getShopList().get(childPosition) != null){
            childViewHolder.goodsImage.setImageResource(R.mipmap.ic_launcher);
            childViewHolder.goodsName.setText(storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsTitle());
            childViewHolder.goods_size.setText("类型:"+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsType());
            childViewHolder.goodsPrice.setText("¥"+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsPrice());
            childViewHolder.goodsBuyNum.setText("×"+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsNum());

            childViewHolder.goodsNumEdit.setText(""+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsNum());
            childViewHolder.goodsSizeEdit.setText("类型:"+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsType());
            childViewHolder.childCheckBox.setChecked(storeInfoList.get(groupPosition).getShopList().get(childPosition).isChoosed());
            //复选框
            childViewHolder.childCheckBox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    storeInfoList.get(groupPosition).getShopList().get(childPosition).setChoosed(((CheckBox) view).isChecked());
                    childViewHolder.childCheckBox.setChecked(((CheckBox) view).isChecked());
                    checkInterface.checkChild(groupPosition,childPosition,((CheckBox) view).isChecked());
                }
            });
            //-
            childViewHolder.reduceGoodsNum.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    modifyCountInterface.doDecrease(groupPosition,childPosition,childViewHolder.goodsNumEdit,childViewHolder.childCheckBox.isChecked());
                }
            });
            //+
            childViewHolder.increaseGoodsNum.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    modifyCountInterface.doIncrease(groupPosition,childPosition,childViewHolder.goodsNumEdit, childViewHolder.childCheckBox.isChecked());
                }
            });
            childViewHolder.goodsNumEdit.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //TODO  编辑商品数量
                }
            });
            //删除
            childViewHolder.delGoods.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(context)
                            .setTitle("删除商品")
                            .setMessage("确定删除该商品吗?")
                            .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    modifyCountInterface.childDelete(groupPosition,childPosition);
                                    dialogInterface.dismiss();
                                }
                            })
                            .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    dialogInterface.dismiss();
                                }
                            });
                    builder.create().show();
                }
            });
        }

下面是在activity页面里实现功能的操作

1、右上角编辑按钮

/**
     * 右上角编辑按钮
     * ActionBar标题上点编辑的时候,只显示每一个店铺的商品修改界面
     * ActionBar标题上点完成的时候,只显示每一个店铺的商品信息界面
     */
    private void setActionBarEditor() {
        for (int i = 0; i < storeInfoList.size(); i++) {
            ShoppingcartStoreInfo group = storeInfoList.get(i);
            if (group.isActionBarEditor()) {
                group.setActionBarEditor(false);
                flag = false;
            } else {
                group.setActionBarEditor(true);
                flag = true;
            }
            setVisiable();
        }
        adapter.notifyDataSetChanged();
    }
    private void setVisiable() {
        if (flag) {
            tv_management.setText("完成");
        } else {
            tv_management.setText("管理");
        }
    }

2、底部左下角全选和反选按钮

   /**
     * 底部左下角全选和反选按钮
     */
    private void doCheckAll() {
        for (int i = 0; i < storeInfoList.size(); i++) {
            ShoppingcartStoreInfo group = storeInfoList.get(i);
            group.setChoosed(checkAll.isChecked());
            List<ShoppingcartGoodsInfo> child = storeInfoList.get(i).getShopList();
            for (int j = 0; j < child.size(); j++) {
                child.get(j).setChoosed(checkAll.isChecked());
            }
        }
        adapter.notifyDataSetChanged();
        calulate();
    }

3、计算商品总价

/**
     * 计算商品总价格,操作步骤
     * 1.先清空全局计价,计数
     * 2.遍历所有的子元素,只要是被选中的,就进行相关的计算操作
     * 3.给textView填充数据
     */
    private void calulate() {
        mtotalPrice = 0.00;
        mtotalCount = 0;
        for (int i = 0; i < storeInfoList.size(); i++) {
            List<ShoppingcartGoodsInfo> child = storeInfoList.get(i).getShopList();
            for (int j = 0; j < child.size(); j++) {
                ShoppingcartGoodsInfo good = child.get(j);
                if (good.isChoosed()) {
                    mtotalCount++;
                    mtotalPrice += good.getGoodsPrice() * good.getGoodsNum();
                }
            }
        }
        tv_totalPrice.setText("¥" + mtotalPrice + "");
        btn_settlement.setText("结算(" + mtotalCount + ")");
        if (mtotalCount == 0) {
//            setCartNum();
        } else {
            shoppingcatNum.setText("购物车(" + mtotalCount + ")");//类似淘宝标题栏的购物车数量
        }
    }

4、组(店铺)的全选按钮

/**
     * 组group选中按钮
     * @param groupPosition 组元素的位置
     * @param isChecked     组元素的选中与否
     *                      思路:组元素被选中了,那么下辖全部的子元素也被选中
     */
    @Override
    public void checkGroup(int groupPosition, boolean isChecked) {
        List<ShoppingcartGoodsInfo> child = storeInfoList.get(groupPosition).getShopList();
        for (int i = 0; i < child.size(); i++) {
            child.get(i).setChoosed(isChecked);
        }
        if (isCheckAll()) {
            checkAll.setChecked(true);//全选
        } else {
            checkAll.setChecked(false);//反选
        }
        adapter.notifyDataSetChanged();
        calulate();
    }

5、子列表(店铺里商品)按钮的选中

/**
     * 子child选中按钮
     * @param groupPosition 组元素的位置
     * @param childPosition 子元素的位置
     * @param isChecked     子元素的选中与否
     */
    @Override
    public void checkChild(int groupPosition, int childPosition, boolean isChecked) {
        boolean allChildSameState = true; //判断该组下面的所有子元素是否处于同一状态
        List<ShoppingcartGoodsInfo> child = storeInfoList.get(groupPosition).getShopList();
        for (int i = 0; i < child.size(); i++) {
            //不选全中
            if (child.get(i).isChoosed() != isChecked) {
                allChildSameState = false;
                break;
            }
        }

        if (allChildSameState) {
            storeInfoList.get(groupPosition).setChoosed(isChecked);//如果子元素状态相同,那么对应的组元素也设置成这一种的同一状态
        } else {
            storeInfoList.get(groupPosition).setChoosed(false);//否则一律视为未选中
        }

        if (isCheckAll()) {
            checkAll.setChecked(true);//全选
        } else {
            checkAll.setChecked(false);//反选
        }

        adapter.notifyDataSetChanged();
        calulate();
    }

6、判断所有组的按钮是否全选中

/**
     * 判断所有组的按钮是否全选中
     * @return
     */
    private boolean isCheckAll(){
        boolean childIsChoosed = true;//子商品是否选择
        boolean groupIsChoosed = true;//组元素是否选中
        for (int i = 0; i < storeInfoList.size();i++){
            List<ShoppingcartGoodsInfo> child = storeInfoList.get(i).getShopList();
            for (int j = 0; j < child.size(); j++){
                if (child.get(j).isChoosed()){
                    childIsChoosed = true;//已选中
                }else {
                    childIsChoosed = false;//未选中
                    break;
                }
            }
            if (childIsChoosed){
                storeInfoList.get(i).setChoosed(true);//如果子商品全选中,那么此店铺对应的组元素也选中
                groupIsChoosed = true;
            }else {
                storeInfoList.get(i).setChoosed(false);//否则组元素视为未选中
                groupIsChoosed = false;
                break;
            }
        }
        return groupIsChoosed;
    }

7、商品的增加按钮

/**
     * 增加商品按钮
     * @param groupPosition 组元素的位置
     * @param childPosition 子元素的位置
     * @param showCountView 用于展示变化后数量的View
     * @param isChecked     子元素选中与否
     */
    @Override
    public void doIncrease(int groupPosition, int childPosition, View showCountView, boolean isChecked) {
        ShoppingcartGoodsInfo good = (ShoppingcartGoodsInfo) adapter.getChild(groupPosition, childPosition);
        int count = good.getGoodsNum();
        count++;
        good.setGoodsNum(count);
        ((TextView) showCountView).setText(String.valueOf(count));
        adapter.notifyDataSetChanged();
        calulate();
    }

8、商品的减少按钮

/**
     * 减少商品按钮
     * @param groupPosition
     * @param childPosition
     * @param showCountView
     * @param isChecked
     */
    @Override
    public void doDecrease(int groupPosition, int childPosition, View showCountView, boolean isChecked) {
        ShoppingcartGoodsInfo good = (ShoppingcartGoodsInfo) adapter.getChild(groupPosition, childPosition);
        int count = good.getGoodsNum();
        if (Integer.parseInt(((TextView) showCountView).getText().toString()) <= 1 ){
            count = 1;
            ((TextView) showCountView).setText("" + count);
            Toast.makeText(this,"不能少于1件",Toast.LENGTH_SHORT).show();
            return;
        }
        count--;
        good.setGoodsNum(count);
        ((TextView) showCountView).setText("" + count);
        adapter.notifyDataSetChanged();
        calulate();
    }

9、商品编辑时候的商品删除按钮

/**
     * 子child中删除按钮
     * @param groupPosition
     * @param childPosition 思路:当子元素=0,那么组元素也要删除
     */
    @Override
    public void childDelete(int groupPosition, int childPosition) {
        List<ShoppingcartGoodsInfo> child = storeInfoList.get(groupPosition).getShopList();
        child.remove(childPosition);
        if (child.size() == 0) {
            storeInfoList.remove(groupPosition);
        }
        adapter.notifyDataSetChanged();
        calulate();
    }

下面附上完整代码:

购物车页面布局activity_shopcart.xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="46dp"
            android:background="@color/colorAccent">

            <TextView
                android:id="@+id/shoppingcatNum"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:text="购物车(15)"
                android:textColor="@color/white"
                android:textSize="18sp"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/tv_management"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:layout_marginRight="15dp"
                android:text="管理"
                android:textColor="@color/white"
                android:textSize="15sp" />
        </RelativeLayout>

        <ExpandableListView
            android:id="@+id/expandableListView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:childDivider="@color/gray_color"
            android:dividerHeight="1dp"
            android:groupIndicator="@null" />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal"
        android:gravity="center_vertical"
        android:layout_alignParentBottom="true"
        android:background="@color/gray_color">
        <CheckBox
            android:id="@+id/checkAll"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_marginLeft="10dp"
            android:text="全选"
            android:textSize="15sp"
            android:textColor="@color/black"/>
        <TextView
            android:id="@+id/tv_heji"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="合计:"
            android:textSize="15sp"
            android:textColor="@color/black"/>
        <TextView
            android:id="@+id/tv_totalPrice"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:text="¥0.00"
            android:textColor="@color/red_text"
            android:textSize="15sp"
            android:textStyle="bold"/>
        <Button
            android:id="@+id/btn_settlement"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@color/red_text"
            android:textColor="@color/white"
            android:textSize="15sp"
            android:text="结算:(5)"/>
    </LinearLayout>
</RelativeLayout>

列表组(店铺)布局item_group_shoppingcart.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <CheckBox
            android:id="@+id/item_shopcart_group_checkBox"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_weight="1" />

        <TextView
            android:id="@+id/item_shopcart_group_nameTv"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_weight="4"
            android:text="1号店铺"
            android:textColor="@color/black"
            android:textSize="15sp" />

        <Button
            android:id="@+id/item_shopcart_group_editBtn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:layout_weight="1"
            android:background="@color/white"
            android:text="编辑" />

    </LinearLayout>
</LinearLayout>

子列表(店铺里商品)布局item_child_shoppingcart.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:paddingLeft="10dp"
        android:gravity="center_vertical">

        <CheckBox
            android:id="@+id/item_shopcart_child_checkBox"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <!--图片的paddingTop与paddingBotton与内容布局的一样:如需修改,请注意-->
        <ImageView
            android:id="@+id/item_shopcart_child_goods_image"
            android:layout_width="90dp"
            android:layout_height="90dp"
            android:layout_marginLeft="10dp"
            android:src="@mipmap/lead_1"/>
        <!--未编辑时的布局-->
        <LinearLayout
            android:id="@+id/item_shopcart_child_goods_data_noedit"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="6dp"
            android:orientation="vertical"
            android:visibility="visible">
            <TextView
                android:id="@+id/tv_goodsTitle"
                android:layout_width="wrap_content"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:text="1号店铺的第一个商品"
                android:textColor="@color/black"
                android:textSize="15sp"/>
            <TextView
                android:id="@+id/tv_goodsType"
                android:layout_width="wrap_content"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:layout_marginTop="5dp"
                android:text="类型:半袖,颜色:白色"
                android:textColor="@color/gray_color"
                android:textSize="13sp"/>
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:gravity="center_vertical">
                <TextView
                    android:id="@+id/tv_goodsPrice"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="¥100.00"
                    android:textSize="13sp"
                    android:textStyle="bold"
                    android:textColor="@color/red_text"/>
                <TextView
                    android:id="@+id/tv_goodsNum"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentRight="true"
                    android:layout_marginRight="10dp"
                    android:text="×1"
                    android:textSize="13sp"
                    android:textColor="@color/gray_color"/>
            </RelativeLayout>
        </LinearLayout>

        <!--编辑时的布局-->
        <LinearLayout
            android:id="@+id/item_shopcart_child_edit_goods_data"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            android:visibility="gone">

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="3"
                android:orientation="vertical">
                <LinearLayout
                    android:layout_marginTop="12px"
                    android:layout_width="match_parent"
                    android:layout_height="66px"
                    android:layout_marginRight="10dp"
                    android:orientation="horizontal">
                    <Button
                        android:id="@+id/item_shopcart_child_reduce"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:text="-"/>
                    <TextView
                        android:id="@+id/tv_item_shopcart_child_goods_Num_edit"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:text="2"
                        android:gravity="center"/>
                    <Button
                        android:id="@+id/item_shopcart_child_add"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:text="+"
                        android:textColor="@color/red_text"/>
                </LinearLayout>
                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:gravity="center_vertical">
                    <TextView
                        android:id="@+id/item_shopcart_child_goods_sizeEdit"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="类型:半袖,颜色:白色"
                        android:textColor="@color/gray_color"
                        android:textSize="13sp"/>
                    <ImageView
                        android:layout_toRightOf="@id/item_shopcart_child_goods_sizeEdit"
                        android:layout_alignBottom="@id/item_shopcart_child_goods_sizeEdit"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="10dp"
                        android:layout_marginBottom="4dp"
                        android:src="@mipmap/d44_icon_jiantou_xia" />
                </RelativeLayout>
            </LinearLayout>

            <TextView
                android:id="@+id/tv_goodsDel"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:background="@color/red_text"
                android:text="删除"
                android:textColor="@color/white"/>
        </LinearLayout>

    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/gray_color"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"/>

</LinearLayout>

适配器adapter文件ShoppingcartAdapter

package com.junto.text.ShoppingCart;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.junto.text.R;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by WangJinyong on 2019/7/8.
 * 购物车  二级列表适配器 adapter
 */

public class ShoppingcartAdapter extends BaseExpandableListAdapter {

    private Context context;
    private List<ShoppingcartStoreInfo> storeInfoList = new ArrayList<>();
    private CheckInterface checkInterface;
    private GroupEditorListener groupEditorListener;
    private ModifyCountInterface modifyCountInterface;
    private int count = 0;
    private boolean flag=true; //组的编辑按钮是否可见,true可见,false不可见

    public ShoppingcartAdapter(Context context,List<ShoppingcartStoreInfo> storeInfoList){
        this.context = context;
        this.storeInfoList = storeInfoList;
    }

    @Override
    public int getGroupCount() {
        return storeInfoList == null ?0:storeInfoList.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return storeInfoList.get(groupPosition).getShopList().size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return storeInfoList.get(groupPosition);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return storeInfoList.get(groupPosition).getShopList().get(childPosition);
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public View getGroupView(final int groupPosition, boolean b, View convertView, ViewGroup viewGroup) {
        GroupViewHolder groupViewHolder;
        if (convertView == null){
            groupViewHolder = new GroupViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.item_group_shoppingcart,viewGroup,false);
            groupViewHolder.storeCheckBox = convertView.findViewById(R.id.item_shopcart_group_checkBox);
            groupViewHolder.storeName = convertView.findViewById(R.id.item_shopcart_group_nameTv);
            groupViewHolder.storeEdit = convertView.findViewById(R.id.item_shopcart_group_editBtn);
            convertView.setTag(groupViewHolder);
        }else {
            groupViewHolder = (GroupViewHolder) convertView.getTag();
        }
        groupViewHolder.storeName.setText(storeInfoList.get(groupPosition).getShopName());
        groupViewHolder.storeCheckBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                storeInfoList.get(groupPosition).setChoosed(((CheckBox)view).isChecked());
                checkInterface.checkGroup(groupPosition,((CheckBox)view).isChecked());
            }
        });
        groupViewHolder.storeCheckBox.setChecked(storeInfoList.get(groupPosition).isChoosed());

        /**【文字指的是组的按钮的文字】
         * 当我们按下ActionBar的 "编辑"按钮, 应该把所有组的文字显示"编辑",并且设置按钮为不可见
         * 当我们完成编辑后,再把组的编辑按钮设置为可见
         * 不懂,请自己操作淘宝,观察一遍
         */
        if(storeInfoList.get(groupPosition).isActionBarEditor()){
            storeInfoList.get(groupPosition).setEditor(false);
            groupViewHolder.storeEdit.setVisibility(View.INVISIBLE);
            flag=false;
        }else{
            flag=true;
            groupViewHolder.storeEdit.setVisibility(View.VISIBLE);
        }

        /**
         * 思路:当我们按下组的"编辑"按钮后,组处于编辑状态,文字显示"完成"
         * 当我们点击“完成”按钮后,文字显示"编辑“,组处于未编辑状态
         */
        if (storeInfoList.get(groupPosition).isEditor()){
            groupViewHolder.storeEdit.setText("完成");
        }else {
            groupViewHolder.storeEdit.setText("编辑");
        }
        groupViewHolder.storeEdit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                groupEditorListener.groupEditor(groupPosition);
                if (storeInfoList.get(groupPosition).isEditor()){
                    storeInfoList.get(groupPosition).setEditor(false);
                }else {
                    storeInfoList.get(groupPosition).setEditor(true);
                }
                notifyDataSetChanged();
            }
        });

        return convertView;
    }

    @Override
    public View getChildView(final int groupPosition, final int childPosition, boolean b, View convertView, ViewGroup viewGroup) {
        final ChildViewHolder childViewHolder;
        if (convertView == null){
            childViewHolder = new ChildViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.item_child_shoppingcart,viewGroup,false);
            childViewHolder.childCheckBox = convertView.findViewById(R.id.item_shopcart_child_checkBox);
            childViewHolder.goodsImage = convertView.findViewById(R.id.item_shopcart_child_goods_image);
            childViewHolder.goodsDataNoedit = convertView.findViewById(R.id.item_shopcart_child_goods_data_noedit);
            childViewHolder.goodsName = convertView.findViewById(R.id.tv_goodsTitle);
            childViewHolder.goods_size = convertView.findViewById(R.id.tv_goodsType);
            childViewHolder.goodsPrice = convertView.findViewById(R.id.tv_goodsPrice);
            childViewHolder.goodsBuyNum = convertView.findViewById(R.id.tv_goodsNum);

            childViewHolder.editGoodsData = convertView.findViewById(R.id.item_shopcart_child_edit_goods_data);
            childViewHolder.reduceGoodsNum = convertView.findViewById(R.id.item_shopcart_child_reduce);
            childViewHolder.goodsNumEdit = convertView.findViewById(R.id.tv_item_shopcart_child_goods_Num_edit);
            childViewHolder.increaseGoodsNum = convertView.findViewById(R.id.item_shopcart_child_add);
            childViewHolder.goodsSizeEdit = convertView.findViewById(R.id.item_shopcart_child_goods_sizeEdit);
            childViewHolder.delGoods = convertView.findViewById(R.id.tv_goodsDel);
            convertView.setTag(childViewHolder);
        }else {
            childViewHolder = (ChildViewHolder) convertView.getTag();
        }

        /**
         * 根据组的编辑按钮的可见与不可见,去判断是组对下辖的子元素编辑  还是ActionBar对组的下瞎元素的编辑
         * 如果组的编辑按钮可见,那么肯定是组对自己下辖元素的编辑
         * 如果组的编辑按钮不可见,那么肯定是ActionBar对组下辖元素的编辑
         */
        if (flag){//组的编辑按钮可见
            if (storeInfoList.get(groupPosition).isEditor()){//组对自己下辖元素的编辑
                childViewHolder.editGoodsData.setVisibility(View.VISIBLE);//编辑时布局显示
                childViewHolder.goodsDataNoedit.setVisibility(View.GONE);//未编辑时布局隐藏掉
            }else {
                childViewHolder.editGoodsData.setVisibility(View.GONE);//编辑时布局隐藏掉
                childViewHolder.goodsDataNoedit.setVisibility(View.VISIBLE);//未编辑时布局显示
            }
        }else {//组的编辑按钮不可见
            if(storeInfoList.get(groupPosition).isActionBarEditor()){
                childViewHolder.editGoodsData.setVisibility(View.VISIBLE);//编辑时布局显示
                childViewHolder.goodsDataNoedit.setVisibility(View.GONE);//未编辑时布局隐藏掉
            }else {
                childViewHolder.editGoodsData.setVisibility(View.GONE);//编辑时布局隐藏掉
                childViewHolder.goodsDataNoedit.setVisibility(View.VISIBLE);//未编辑时布局显示
            }
        }

        if (storeInfoList.get(groupPosition).getShopList().get(childPosition) != null){
            childViewHolder.goodsImage.setImageResource(R.mipmap.ic_launcher);
            childViewHolder.goodsName.setText(storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsTitle());
            childViewHolder.goods_size.setText("类型:"+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsType());
            childViewHolder.goodsPrice.setText("¥"+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsPrice());
            childViewHolder.goodsBuyNum.setText("×"+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsNum());

            childViewHolder.goodsNumEdit.setText(""+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsNum());
            childViewHolder.goodsSizeEdit.setText("类型:"+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsType());
            childViewHolder.childCheckBox.setChecked(storeInfoList.get(groupPosition).getShopList().get(childPosition).isChoosed());
            //复选框
            childViewHolder.childCheckBox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    storeInfoList.get(groupPosition).getShopList().get(childPosition).setChoosed(((CheckBox) view).isChecked());
                    childViewHolder.childCheckBox.setChecked(((CheckBox) view).isChecked());
                    checkInterface.checkChild(groupPosition,childPosition,((CheckBox) view).isChecked());
                }
            });
            //-
            childViewHolder.reduceGoodsNum.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    modifyCountInterface.doDecrease(groupPosition,childPosition,childViewHolder.goodsNumEdit,childViewHolder.childCheckBox.isChecked());
                }
            });
            //+
            childViewHolder.increaseGoodsNum.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    modifyCountInterface.doIncrease(groupPosition,childPosition,childViewHolder.goodsNumEdit, childViewHolder.childCheckBox.isChecked());
                }
            });
            childViewHolder.goodsNumEdit.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //TODO  编辑商品数量
                }
            });
            //删除
            childViewHolder.delGoods.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(context)
                            .setTitle("删除商品")
                            .setMessage("确定删除该商品吗?")
                            .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    modifyCountInterface.childDelete(groupPosition,childPosition);
                                    dialogInterface.dismiss();
                                }
                            })
                            .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    dialogInterface.dismiss();
                                }
                            });
                    builder.create().show();
                }
            });
        }

        return convertView;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

    /**
     * 店铺的复选框
     */
    public interface CheckInterface {
        /**
         * 组选框状态改变触发的事件
         *
         * @param groupPosition 组元素的位置
         * @param isChecked     组元素的选中与否
         */
        void checkGroup(int groupPosition, boolean isChecked);

        /**
         * 子选框状态改变触发的事件
         *
         * @param groupPosition 组元素的位置
         * @param childPosition 子元素的位置
         * @param isChecked     子元素的选中与否
         */
        void checkChild(int groupPosition, int childPosition, boolean isChecked);
    }

    /**
     * 改变数量的接口
     */
    public interface ModifyCountInterface {
        /**
         * 增加操作
         *
         * @param groupPosition 组元素的位置
         * @param childPosition 子元素的位置
         * @param showCountView 用于展示变化后数量的View
         * @param isChecked     子元素选中与否
         */
        void doIncrease(int groupPosition, int childPosition, View showCountView, boolean isChecked);

        void doDecrease(int groupPosition, int childPosition, View showCountView, boolean isChecked);

        void doUpdate(int groupPosition, int childPosition, View showCountView, boolean isChecked);

        /**
         * 删除子Item
         *
         * @param groupPosition
         * @param childPosition
         */
        void childDelete(int groupPosition, int childPosition);
    }

    /**
     * 监听编辑状态
     */
    public interface GroupEditorListener {
        void groupEditor(int groupPosition);
    }

    public CheckInterface getCheckInterface() {
        return checkInterface;
    }

    public void setCheckInterface(CheckInterface checkInterface) {
        this.checkInterface = checkInterface;
    }

    public GroupEditorListener getGroupEditorListener() {
        return groupEditorListener;
    }

    public void setGroupEditorListener(GroupEditorListener groupEditorListener) {
        this.groupEditorListener = groupEditorListener;
    }

    public ModifyCountInterface getModifyCountInterface() {
        return modifyCountInterface;
    }

    public void setModifyCountInterface(ModifyCountInterface modifyCountInterface) {
        this.modifyCountInterface = modifyCountInterface;
    }

    static class GroupViewHolder {
        CheckBox storeCheckBox;//复选框
        TextView storeName;//店铺名
        TextView storeEdit;//编辑按钮
    }

    static class ChildViewHolder{
        CheckBox childCheckBox;//复选框
        ImageView goodsImage;//商品图片
        LinearLayout goodsDataNoedit;//未编辑状态布局
        TextView goodsName;//商品名称
        TextView goods_size;//商品类型
        TextView goodsPrice;//商品价格
        TextView goodsBuyNum;//商品购买数量

        LinearLayout editGoodsData;//编辑状态布局
        Button reduceGoodsNum;//-
        TextView goodsNumEdit;//编辑时的数量
        Button increaseGoodsNum;//+
        TextView goodsSizeEdit;//商品类型编辑
        TextView delGoods;//删除
    }
}

设置店铺列表数据的实体类文件ShoppingcartStoreInfo

package com.junto.text.ShoppingCart;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by WangJinyong on 2019/7/8.
 * 店铺列表
 */

public class ShoppingcartStoreInfo implements Serializable {

    private boolean choosed;//是否选择
    private String shopName;//店铺名
    private boolean editor;//编辑
    private List<ShoppingcartGoodsInfo> shopList = new ArrayList<>();//店铺里的商品列表

    private boolean actionBarEditor;//题上的编辑(管理)或完成

    public boolean isChoosed() {
        return choosed;
    }

    public void setChoosed(boolean choosed) {
        this.choosed = choosed;
    }

    public String getShopName() {
        return shopName;
    }

    public void setShopName(String shopName) {
        this.shopName = shopName;
    }

    public boolean isEditor() {
        return editor;
    }

    public void setEditor(boolean editor) {
        this.editor = editor;
    }

    public List<ShoppingcartGoodsInfo> getShopList() {
        return shopList;
    }

    public void setShopList(List<ShoppingcartGoodsInfo> shopList) {
        this.shopList = shopList;
    }

    public boolean isActionBarEditor() {
        return actionBarEditor;
    }

    public void setActionBarEditor(boolean actionBarEditor) {
        this.actionBarEditor = actionBarEditor;
    }
}

设置商品列表的实体类文件ShoppingcartGoodsInfo

package com.junto.text.ShoppingCart;

import java.io.Serializable;

/**
 * Created by WangJinyong on 2019/7/8.
 * 店铺里商品列表
 */

public class ShoppingcartGoodsInfo implements Serializable {

    private boolean choosed;//是否选择
    private String goodsTitle;//商品标题
    private String goodsType;//商品类型
    private Double goodsPrice;//商品单价
    private int goodsNum;//商品数量

    public boolean isChoosed() {
        return choosed;
    }

    public void setChoosed(boolean choosed) {
        this.choosed = choosed;
    }

    public String getGoodsTitle() {
        return goodsTitle;
    }

    public void setGoodsTitle(String goodsTitle) {
        this.goodsTitle = goodsTitle;
    }

    public String getGoodsType() {
        return goodsType;
    }

    public void setGoodsType(String goodsType) {
        this.goodsType = goodsType;
    }

    public Double getGoodsPrice() {
        return goodsPrice;
    }

    public void setGoodsPrice(Double goodsPrice) {
        this.goodsPrice = goodsPrice;
    }

    public int getGoodsNum() {
        return goodsNum;
    }

    public void setGoodsNum(int goodsNum) {
        this.goodsNum = goodsNum;
    }
}

购物车整体页面及功能实现类ShopCartActivity

package com.junto.text.ShoppingCart;

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.Toast;

import com.junto.text.R;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by WangJinyong on 2019/7/9.
 * 仿购物车页面
 */

public class ShopCartActivity extends Activity implements ShoppingcartAdapter.CheckInterface,ShoppingcartAdapter.GroupEditorListener,ShoppingcartAdapter.ModifyCountInterface {

    private TextView shoppingcatNum,tv_management;//标题购物车及商品总数 、管理
    private CheckBox checkAll;//全选
    private TextView tv_totalPrice;//总价
    private Button btn_settlement;//结算

    private ExpandableListView expandableListView;
    private ShoppingcartAdapter adapter;
    private List<ShoppingcartStoreInfo> storeInfoList = new ArrayList<>();
    private List<ShoppingcartGoodsInfo> goodsInfoList = new ArrayList<>();

    private boolean flag=true; //右上角的编辑按钮false就是右上角编辑,ture就是完成

    private double mtotalPrice;//总价格
    private int mtotalCount;//总商品数

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shopcart);
        initView();
    }

    private void initView(){
        shoppingcatNum = findViewById(R.id.shoppingcatNum);
        tv_management = findViewById(R.id.tv_management);
        tv_management.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.e("tag","管理");
                setActionBarEditor();
            }
        });

        checkAll = findViewById(R.id.checkAll);
        checkAll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.e("tag","全选");
                doCheckAll();
            }
        });

        tv_totalPrice = findViewById(R.id.tv_totalPrice);

        btn_settlement = findViewById(R.id.btn_settlement);
        btn_settlement.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.e("tag","结算");
            }
        });
        expandableListView = findViewById(R.id.expandableListView);
        ShoppingcartStoreInfo shoppingcartStoreInfo1 = new ShoppingcartStoreInfo();
        shoppingcartStoreInfo1.setShopName("1号店铺");
        shoppingcartStoreInfo1.setEditor(false);
        shoppingcartStoreInfo1.setChoosed(false);
        ShoppingcartGoodsInfo shoppingcartGoodsInfo1 = new ShoppingcartGoodsInfo();
        shoppingcartGoodsInfo1.setGoodsTitle("1号店铺的第一件商品");
        shoppingcartGoodsInfo1.setGoodsType("款式:半袖,颜色:白色");
        shoppingcartGoodsInfo1.setGoodsPrice(100.00);
        shoppingcartGoodsInfo1.setGoodsNum(2);
        ShoppingcartGoodsInfo shoppingcartGoodsInfo2 = new ShoppingcartGoodsInfo();
        shoppingcartGoodsInfo2.setGoodsTitle("1号店铺的第2件商品");
        shoppingcartGoodsInfo2.setGoodsType("款式:半袖,颜色:白色");
        shoppingcartGoodsInfo2.setGoodsPrice(34.00);
        shoppingcartGoodsInfo2.setGoodsNum(3);
        goodsInfoList.add(shoppingcartGoodsInfo1);
        goodsInfoList.add(shoppingcartGoodsInfo2);
        shoppingcartStoreInfo1.setShopList(goodsInfoList);

        List<ShoppingcartGoodsInfo> goodsInfoList2 = new ArrayList<>();
        ShoppingcartStoreInfo shoppingcartStoreInfo2 = new ShoppingcartStoreInfo();
        shoppingcartStoreInfo2.setShopName("2号店铺");
        shoppingcartStoreInfo2.setEditor(false);
        shoppingcartStoreInfo2.setChoosed(false);
        ShoppingcartGoodsInfo shoppingcartGoodsInfo3 = new ShoppingcartGoodsInfo();
        shoppingcartGoodsInfo3.setGoodsTitle("2号店铺的第一件商品");
        shoppingcartGoodsInfo3.setGoodsType("款式:短裤,颜色:蓝色");
        shoppingcartGoodsInfo3.setGoodsPrice(19.00);
        shoppingcartGoodsInfo3.setGoodsNum(5);
        ShoppingcartGoodsInfo shoppingcartGoodsInfo4 = new ShoppingcartGoodsInfo();
        shoppingcartGoodsInfo4.setGoodsTitle("2号店铺的第2件商品");
        shoppingcartGoodsInfo4.setGoodsType("款式:连衣裙,颜色:粉色");
        shoppingcartGoodsInfo4.setGoodsPrice(98.00);
        shoppingcartGoodsInfo4.setGoodsNum(1);
        goodsInfoList2.add(shoppingcartGoodsInfo3);
        goodsInfoList2.add(shoppingcartGoodsInfo4);
        shoppingcartStoreInfo2.setShopList(goodsInfoList2);

        storeInfoList.add(shoppingcartStoreInfo1);
        storeInfoList.add(shoppingcartStoreInfo2);

        adapter = new ShoppingcartAdapter(this,storeInfoList);
        adapter.setCheckInterface(this);
        adapter.setGroupEditorListener(this);
        adapter.setModifyCountInterface(this);
        expandableListView.setAdapter(adapter);

        //列表全部展开
        for (int i = 0; i < adapter.getGroupCount(); i++) {
            expandableListView.expandGroup(i);
        }

    }

    /**
     * 右上角编辑按钮
     * ActionBar标题上点编辑的时候,只显示每一个店铺的商品修改界面
     * ActionBar标题上点完成的时候,只显示每一个店铺的商品信息界面
     */
    private void setActionBarEditor() {
        for (int i = 0; i < storeInfoList.size(); i++) {
            ShoppingcartStoreInfo group = storeInfoList.get(i);
            if (group.isActionBarEditor()) {
                group.setActionBarEditor(false);
                flag = false;
            } else {
                group.setActionBarEditor(true);
                flag = true;
            }
            setVisiable();
        }
        adapter.notifyDataSetChanged();
    }
    private void setVisiable() {
        if (flag) {
            tv_management.setText("完成");
        } else {
            tv_management.setText("管理");
        }
    }

    /**
     * 删除操作  右上角为编辑状态下,删除按钮(选中删除)
     * 1.不要边遍历边删除,容易出现数组越界的情况
     * 2.把将要删除的对象放进相应的容器中,待遍历完,用removeAll的方式进行删除
     */
    private void doDelete(){
        List<ShoppingcartStoreInfo> toBeDeleteGroups = new ArrayList<>(); //待删除的组元素
        for (int i = 0; i < storeInfoList.size(); i++) {
            ShoppingcartStoreInfo group = storeInfoList.get(i);
            if (group.isChoosed()) {
                toBeDeleteGroups.add(group);
            }
            List<ShoppingcartGoodsInfo> toBeDeleteChilds = new ArrayList<>();//待删除的子元素
            List<ShoppingcartGoodsInfo> child = storeInfoList.get(i).getShopList();
            for (int j = 0; j < child.size(); j++) {
                if (child.get(j).isChoosed()) {
                    toBeDeleteChilds.add(child.get(j));
                }
            }
            child.removeAll(toBeDeleteChilds);
        }
        storeInfoList.removeAll(toBeDeleteGroups);
        //重新设置购物车
//        setCartNum();
        adapter.notifyDataSetChanged();
    }

    /**
     * 底部左下角全选和反选按钮
     * 错误标记:在这里出现过错误
     */
    private void doCheckAll() {
        for (int i = 0; i < storeInfoList.size(); i++) {
            ShoppingcartStoreInfo group = storeInfoList.get(i);
            group.setChoosed(checkAll.isChecked());
            List<ShoppingcartGoodsInfo> child = storeInfoList.get(i).getShopList();
            for (int j = 0; j < child.size(); j++) {
                child.get(j).setChoosed(checkAll.isChecked());//这里出现过错误
            }
        }
        adapter.notifyDataSetChanged();
        calulate();
    }

    /**
     * 计算商品总价格,操作步骤
     * 1.先清空全局计价,计数
     * 2.遍历所有的子元素,只要是被选中的,就进行相关的计算操作
     * 3.给textView填充数据
     */
    private void calulate() {
        mtotalPrice = 0.00;
        mtotalCount = 0;
        for (int i = 0; i < storeInfoList.size(); i++) {
            List<ShoppingcartGoodsInfo> child = storeInfoList.get(i).getShopList();
            for (int j = 0; j < child.size(); j++) {
                ShoppingcartGoodsInfo good = child.get(j);
                if (good.isChoosed()) {
                    mtotalCount++;
                    mtotalPrice += good.getGoodsPrice() * good.getGoodsNum();
                }
            }
        }
        tv_totalPrice.setText("¥" + mtotalPrice + "");
        btn_settlement.setText("结算(" + mtotalCount + ")");
        if (mtotalCount == 0) {
//            setCartNum();
        } else {
            shoppingcatNum.setText("购物车(" + mtotalCount + ")");//类似淘宝标题栏的购物车数量
        }
    }

    /**
     * 组group选中按钮
     * @param groupPosition 组元素的位置
     * @param isChecked     组元素的选中与否
     *                      思路:组元素被选中了,那么下辖全部的子元素也被选中
     */
    @Override
    public void checkGroup(int groupPosition, boolean isChecked) {
        List<ShoppingcartGoodsInfo> child = storeInfoList.get(groupPosition).getShopList();
        for (int i = 0; i < child.size(); i++) {
            child.get(i).setChoosed(isChecked);
        }
        if (isCheckAll()) {
            checkAll.setChecked(true);//全选
        } else {
            checkAll.setChecked(false);//反选
        }
        adapter.notifyDataSetChanged();
        calulate();
    }

    /**
     * 子child选中按钮
     * @param groupPosition 组元素的位置
     * @param childPosition 子元素的位置
     * @param isChecked     子元素的选中与否
     */
    @Override
    public void checkChild(int groupPosition, int childPosition, boolean isChecked) {
        boolean allChildSameState = true; //判断该组下面的所有子元素是否处于同一状态
        List<ShoppingcartGoodsInfo> child = storeInfoList.get(groupPosition).getShopList();
        for (int i = 0; i < child.size(); i++) {
            //不选全中
            if (child.get(i).isChoosed() != isChecked) {
                allChildSameState = false;
                break;
            }
        }

        if (allChildSameState) {
            storeInfoList.get(groupPosition).setChoosed(isChecked);//如果子元素状态相同,那么对应的组元素也设置成这一种的同一状态
        } else {
            storeInfoList.get(groupPosition).setChoosed(false);//否则一律视为未选中
        }

        if (isCheckAll()) {
            checkAll.setChecked(true);//全选
        } else {
            checkAll.setChecked(false);//反选
        }

        adapter.notifyDataSetChanged();
        calulate();
    }

    /**
     * 判断所有组的按钮是否全选中
     * @return
     */
    private boolean isCheckAll(){
        boolean childIsChoosed = true;//子商品是否选择
        boolean groupIsChoosed = true;//组元素是否选中
        for (int i = 0; i < storeInfoList.size();i++){
            List<ShoppingcartGoodsInfo> child = storeInfoList.get(i).getShopList();
            for (int j = 0; j < child.size(); j++){
                if (child.get(j).isChoosed()){
                    childIsChoosed = true;//已选中
                }else {
                    childIsChoosed = false;//未选中
                    break;
                }
            }
            if (childIsChoosed){
                storeInfoList.get(i).setChoosed(true);//如果子商品全选中,那么此店铺对应的组元素也选中
                groupIsChoosed = true;
            }else {
                storeInfoList.get(i).setChoosed(false);//否则组元素视为未选中
                groupIsChoosed = false;
                break;
            }
        }
        return groupIsChoosed;
    }

    /**
     * 组的编辑按钮
     * @param groupPosition
     */
    @Override
    public void groupEditor(int groupPosition) {
//        setActionBarEditor();
    }

    /**
     * 增加商品按钮
     * @param groupPosition 组元素的位置
     * @param childPosition 子元素的位置
     * @param showCountView 用于展示变化后数量的View
     * @param isChecked     子元素选中与否
     */
    @Override
    public void doIncrease(int groupPosition, int childPosition, View showCountView, boolean isChecked) {
        ShoppingcartGoodsInfo good = (ShoppingcartGoodsInfo) adapter.getChild(groupPosition, childPosition);
        int count = good.getGoodsNum();
        count++;
        good.setGoodsNum(count);
        ((TextView) showCountView).setText(String.valueOf(count));
        adapter.notifyDataSetChanged();
        calulate();
    }

    /**
     * 减少商品按钮
     * @param groupPosition
     * @param childPosition
     * @param showCountView
     * @param isChecked
     */
    @Override
    public void doDecrease(int groupPosition, int childPosition, View showCountView, boolean isChecked) {
        ShoppingcartGoodsInfo good = (ShoppingcartGoodsInfo) adapter.getChild(groupPosition, childPosition);
        int count = good.getGoodsNum();
        if (Integer.parseInt(((TextView) showCountView).getText().toString()) <= 1 ){
            count = 1;
            ((TextView) showCountView).setText("" + count);
            Toast.makeText(this,"不能少于1件",Toast.LENGTH_SHORT).show();
            return;
        }
        count--;
        good.setGoodsNum(count);
        ((TextView) showCountView).setText("" + count);
        adapter.notifyDataSetChanged();
        calulate();
    }

    @Override
    public void doUpdate(int groupPosition, int childPosition, View showCountView, boolean isChecked) {

    }

    /**
     * 子child中删除按钮
     * @param groupPosition
     * @param childPosition 思路:当子元素=0,那么组元素也要删除
     */
    @Override
    public void childDelete(int groupPosition, int childPosition) {
        List<ShoppingcartGoodsInfo> child = storeInfoList.get(groupPosition).getShopList();
        child.remove(childPosition);
        if (child.size() == 0) {
            storeInfoList.remove(groupPosition);
        }
        adapter.notifyDataSetChanged();
        calulate();
    }
}

以上就是实现购物车基本功能的全部内容,有不足之处欢迎指正。

发布了92 篇原创文章 · 获赞 38 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/u013184970/article/details/97780560