仿京东购物车Deom

写代码前要先加上权限和依赖:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
依赖:

compile 'com.android.support:design:26.+'	//tablayout依赖
compile 'com.google.code.gson:gson:2.8.2'
compile 'com.github.bumptech.glide:glide:3.6.0' 
compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.squareup.okio:okio:1.11.0'
compile 'com.android.support:recyclerview-v7:26.+'
因为购物车的逻辑性很强,所以写购物车之前要想清楚要写哪一步,不然很容易蒙圈...

各种需要的工具类中的东西

封装的OkHttp(我是用的OkHttp3请求数据);
因为是封装的,在这里就不多说了,见接口:
一些可能用到的接口:

//加入购物车
public static final String ADDCART_API = "https://www.zhaoapi.cn/product/addCart?uid=2845";
//购物车
public static final String SELECTART_API = "https://www.zhaoapi.cn/product/getCarts?uid=2845";
//更新购物车
public static final String UpDateCart_API = "https://www.zhaoapi.cn/product/updateCarts";
//删除购物车
public static final String DELETECART_API = "https://www.zhaoapi.cn/product/deleteCart";
用MVP的模式写,很清晰也很快;

MVP模式:

到了model层就不要忘了bean包,有些bean包可能要自己手动加入一些东西;
这个在购物车的bean包会让自己手动加入全选的判断(因为我用的接口没有)
public static class DataBean {

    //自己写几个方法(3)

    private boolean allChildInGroupCheck;

    public boolean isGroupCheck() {
        return allChildInGroupCheck;
    }
    public void setGroupCheck(boolean allChildInGroupCheck) {
        this.allChildInGroupCheck = allChildInGroupCheck;
    }

    /**
     * list : [{"bargainPrice":399,"createtime":"2017-10-02T15:20:02","detailUrl":"https://item.m.jd.com/product/1439822107.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t5887/201/859509257/69994/6bde9bf6/59224c24Ne854e14c.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5641/233/853609022/57374/5c73d281/59224c24N3324d5f4.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5641/233/853609022/57374/5c73d281/59224c24N3324d5f4.jpg!q70.jpg","num":2,"pid":81,"price":699,"pscid":85,"selected":0,"sellerid":2,"subhead":"2件,总价打6.50","title":"Gap男装 休闲舒适简约水洗五袋直筒长裤紧身牛仔裤941825 深灰色 33/32(175/84A)"}]
     * sellerName : 商家2
     * sellerid : 2
     */
CountPriceBean,这个bean包是计算价钱的包;
public class CountPriceBean {
    private String priceString;
    private int count;

    public CountPriceBean(String priceString, int count) {
        this.priceString = priceString;
        this.count = count;
    }

    public String getPriceString() {
        return priceString;
    }

    public void setPriceString(String priceString) {
        this.priceString = priceString;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}

Model层:

public class CarModel {
    private final ICartPre iCartPre;

    public CarModel(ICartPre iCartPre){
        this.iCartPre = iCartPre;
    }

    public void getData(String url){
        OkHttp3Util.doGet(url, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()){
                    String string = response.body().string();
                    CartBean cartBean = new Gson().fromJson(string, CartBean.class);
                    iCartPre.onSuccess(cartBean);
                }
            }
        });
    }
}
Presenter层:

//p层的一个接口:

public interface ICartPre {
    void onSuccess(CartBean cartBean);
}
//p层接口的实现类:

public class CartPresenter implements ICartPre {

    private CarModel carModel;
    private ICartView iCartView;

    public CartPresenter(ICartView iCartView){
        this.iCartView = iCartView;
        carModel = new CarModel(this);
    }

    public void getData(String url){
        carModel.getData(url);
    }
    @Override
    public void onSuccess(CartBean cartBean) {
        iCartView.onSuccess(cartBean);
    }
}
//View层:

//view层接口:

public interface ICartView {
    void onSuccess(CartBean cartBean);
}
//view层接口的实现类就是Activity或fragment:

//实现接口先不着急,先完成主页面的布局:

要注意,购物车的列表是二级列表,所以自定义一个二级列表:

/**
 * Created by Administrator
 * 购物车的二级列表
 */

public class CartTwoListView extends ExpandableListView {
    public CartTwoListView(Context context) {
        super(context);
    }

    public CartTwoListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CartTwoListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    //重写测量的方法

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int height = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, height);
    }
}

购物车的主布局:

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

    <RelativeLayout
        android:id="@+id/rl1"
        android:layout_width="match_parent"
        android:layout_height="50dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="购物车"
            android:textSize="26sp" />
    </RelativeLayout>

    <ScrollView
        android:id="@+id/sl1"
        android:layout_below="@+id/rl1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <!--二级购物车列表-->
            <wwx.util.CartTwoListView
                android:id="@+id/cartTwoListView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

            </wwx.util.CartTwoListView>

            <!--为你推荐-->
            <TextView
                android:layout_width="match_parent"
                android:layout_height="300dp"
                android:text="为你推荐"
                android:background="#0f0"/>
        </LinearLayout>
    </ScrollView>

    <RelativeLayout
        android:id="@+id/progressBar"
        android:visibility="gone"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </RelativeLayout>
    <LinearLayout
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#fff"
        android:orientation="horizontal">
        <CheckBox
            android:id="@+id/check_all"
            android:layout_width="40dp"
            android:gravity="center"
            android:layout_height="40dp" />
        <TextView
            android:id="@+id/text_total"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:text="合计:0.00"/>
        <TextView
            android:id="@+id/text_buy"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:textColor="#fff"
            android:layout_height="match_parent"
            android:gravity="center"
            android:background="#f00"
            android:layout_marginLeft="10dp"
            android:text="去计算(0)"/>
    </LinearLayout>
</RelativeLayout>
仿京东购物车Deom

购物车的主页面:

/**
 * 仿京东购物车
 */
public class CartActivity extends AppCompatActivity implements ICartView, View.OnClickListener {

    private CartTwoListView cartTwoListView;
    private CheckBox check_all;
    private TextView text_total;
    private TextView text_buy;
    private CartPresenter cartPresenter;
    private RelativeLayout progressBar;
    private CartAdapter adapter;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0) {
                CountPriceBean countPriceBean = (CountPriceBean) msg.obj;
                Log.i("hand", countPriceBean.getPriceString());
                //设置价格和数量
                text_total.setText("合计:¥" + countPriceBean.getPriceString());
                text_buy.setText("去结算(" + countPriceBean.getCount() + ")");

            }
        }
    };
    private CartBean cartBean;
    private String priceString;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cart);
        findView();

    }

    private void findView() {
        cartTwoListView = findViewById(R.id.cartTwoListView);
        progressBar = findViewById(R.id.progressBar);
        check_all = findViewById(R.id.check_all);
        text_total = findViewById(R.id.text_total);
        text_buy = findViewById(R.id.text_buy);

    }

    @Override
    protected void onResume() {
        super.onResume();

        cartPresenter = new CartPresenter(this);
        cartPresenter.getData(Api.SELECTART_API);
        //去掉二级列表默认的显示器
        cartTwoListView.setGroupIndicator(null);
        //刚进入页面时让progressBar显示
        progressBar.setVisibility(View.VISIBLE);
        //全选按钮的设置
        check_all.setOnClickListener(this);
        //点击去结算  		如果不跳转到订单这里的点击操作不用做
        text_buy.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //进入订单页面前先创建订单
                //先判断价钱是否相同再跳转(这里和适配器里的计算价钱的数据一样)
                double price = 0;
                for (int i = 0; i < cartBean.getData().size(); i++) {
                    List<CartBean.DataBean.ListBean> listBeans = cartBean.getData().get(i).getList();
                    for (int j = 0; j < listBeans.size(); j++) {

                        if (listBeans.get(j).getSelected() == 1) {
                            price += listBeans.get(j).getBargainPrice() * listBeans.get(j).getNum();
                        }
                    }
                }

                //double高精度,,,计算的时候可能会出现一串数字...保留两位
                DecimalFormat decimalFormat = new DecimalFormat("0.00");
                priceString = decimalFormat.format(price);
                tiaoDingDan();
            }
        });
    }

    private void tiaoDingDan() {
        Map<String, String> map = new HashMap<>();
        map.put("uid", "2845");
        map.put("price", priceString);
        OkHttp3Util.doPost(Api.CHUANGJIAN_API, map, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                if (response.isSuccessful()) {
                    final String string = response.body().string();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            CreateDingBean createDingBean = new Gson().fromJson(string, CreateDingBean.class);
                            if (createDingBean.getCode().equals("0")) {
                                Toast.makeText(CartActivity.this, createDingBean.getMsg(), Toast.LENGTH_SHORT).show();
                                Intent intent = new Intent(CartActivity.this, DingDanActivity.class);
                                startActivity(intent);
                            } else {
                                Toast.makeText(CartActivity.this, createDingBean.getMsg(), Toast.LENGTH_SHORT).show();

                            }
                        }
                    });
                }

            }
        });
    }

    /**
     * 重写的购物车的方法
     *
     * @param cartBean
     */
    @Override
    public void onSuccess(final CartBean cartBean) {
        this.cartBean = cartBean;
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                List<CartBean.DataBean> cartList = cartBean.getData();
                //数据获取成功后隐藏
                progressBar.setVisibility(View.GONE);
                //如果购物有东西的时候
                if (cartBean != null) {

                    //1.设置适配器
                    adapter = new CartAdapter(CartActivity.this, cartBean, progressBar, cartPresenter, handler);
                    cartTwoListView.setAdapter(adapter);

                    //2.展开二级列表的数据
                    for (int i = 0; i < cartList.size(); i++) {
                        cartTwoListView.expandGroup(i);
                    }

                    //3.设置组的初始状态
                    for (int i = 0; i < cartList.size(); i++) {
                        //先找出当前数组中的所有的孩子
                        List<CartBean.DataBean.ListBean> listBeans = cartList.get(i).getList();
                        //根据孩子的状态设置组的初始状态是否选中
                        cartList.get(i).setGroupCheck(isAllChildInGroupCheck(listBeans));//把孩子都放进去
                    }

                    //4.根据选中计算加减和数量(因为操作都是在适配器中进行,所以放到适配器里执行)
                    adapter.sendPriceAndCount();

                } else {
                    Toast.makeText(CartActivity.this, "购物车是空的", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }


    /**
     * 根据孩子listBeans ,设置组的初始状态是否选中
     *
     * @param listBeans
     */
    private boolean isAllChildInGroupCheck(List<CartBean.DataBean.ListBean> listBeans) {
        for (int i = 0; i < listBeans.size(); i++) {
            //只要有一个组未选中 返回false
            if (listBeans.get(i).getSelected() == 0) {
                return false;
            }
        }
        return true;
    }


    /**
     * 全选按钮的设置
     *
     * @param v
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.check_all:
                adapter.setAllCheck(check_all.isChecked());//根据选择的状态判断
                break;

        }
    }


}

//各种操作都放到适配器中:

适配器
//先来一级条目和二级条目的布局
一级条目的布局 : group_item.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:orientation="horizontal">

    <CheckBox
        android:id="@+id/group_check"
        android:layout_width="40dp"
        android:layout_height="40dp"/>
    <TextView
        android:id="@+id/group_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:text="商家"/>
</LinearLayout>
二级条目的布局: child_item.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:orientation="horizontal">

    <CheckBox
        android:id="@+id/child_check"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_gravity="center"/>

    <ImageView
        android:id="@+id/child_image"
        android:layout_width="100dp"
        android:padding="10dp"
        android:layout_height="100dp"
        android:src="@mipmap/ic_launcher"/>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="match_parent"
        android:padding="10dp"
        android:orientation="vertical">
        <TextView
            android:id="@+id/child_title"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="标题"/>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/child_price"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:textColor="#f00"
                android:text="¥:0.00"/>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:orientation="horizontal">
                <TextView
                    android:id="@+id/child_jian"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="5dp"
                    android:textSize="16sp"
                    android:text=""/>
                <TextView
                    android:id="@+id/child_num"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="5dp"
                    android:textSize="16sp"
                    android:text="1"/>
                <TextView
                    android:id="@+id/child_jia"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="5dp"
                    android:textSize="16sp"
                    android:text=""/>
            </LinearLayout>

        </LinearLayout>

    </LinearLayout>

    <Button
        android:id="@+id/child_del"
        android:layout_width="50dp"
        android:layout_height="match_parent"
        android:text="删除"
        android:background="#f00"
        android:textColor="#fff"/>
</LinearLayout>
仿京东购物车Deom

购物车适配器:

/**
 * Created by Administrator
 * 购物车的适配器
 */

public class CartAdapter extends BaseExpandableListAdapter{
    private Handler handler;
    private CartPresenter cartPresenter;
    private RelativeLayout progressBar;
    private Context context;
    private CartBean cartBean;
    private int childIndex;
    private int allIndex;

    public CartAdapter(Context context, CartBean cartBean, RelativeLayout progressBar, CartPresenter cartPresenter, Handler handler) {
        this.context = context;
        this.cartBean = cartBean;
        this.progressBar = progressBar;
        this.cartPresenter = cartPresenter;
        this.handler = handler;
    }

    /**
     * 返回int就是长度
     * 返回Object为对象
     * 返回long为参数
     * 返回Boolean都是true
     * @return
     */
    @Override
    public int getGroupCount() {
        return cartBean.getData().size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return cartBean.getData().get(groupPosition).getList().size();
    }

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

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return cartBean.getData().get(groupPosition).getList().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 true;
    }

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


    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        final GroupHolder holder;
        if (convertView ==  null){
            holder = new GroupHolder();
            convertView = View.inflate(context,R.layout.group_item,null);
            //找控件
            holder.group_check = convertView.findViewById(R.id.group_check);
            holder.group_text = convertView.findViewById(R.id.group_text);
            convertView.setTag(holder);
        }else {
            holder = (GroupHolder) convertView.getTag();
        }
        //赋值
        final CartBean.DataBean groupBean = cartBean.getData().get(groupPosition);
        holder.group_text.setText(groupBean.getSellerName());//商家的名字
        holder.group_check.setChecked(groupBean.isGroupCheck());//设置点击(自己在bean包里添加的isGroupCheck())
        //商家的点击事件
        holder.group_check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击时先显示progressBar
                progressBar.setVisibility(View.VISIBLE);

                //根据商家的状态改变子条目的状态  一个一个更新,更新完一个之后再执行下一个
                childIndex = 0;
                //根据集合中的数据和商家的点击状态
                upDataAllChildInGroup(groupBean,holder.group_check.isChecked());
            }
        });

        return convertView;
    }

    /**
     * 更细子条目的数据
     * @param groupBean
     * @param checked
     */
    private void upDataAllChildInGroup(final CartBean.DataBean groupBean, final boolean checked) {
        //先得到所有的子条目
        CartBean.DataBean.ListBean listBean = groupBean.getList().get(childIndex);

        Map<String, String> params = new HashMap<>();

        //因为更新时所有的状态都可能改变,就都放到map        params.put("uid", "2845");
        params.put("sellerid", String.valueOf(listBean.getSellerid()));
        params.put("pid", String.valueOf(listBean.getPid()));
        params.put("selected", String.valueOf(checked ? 1 : 0));//如果选中就是1,否则为0(三元运算符)
        params.put("num", String.valueOf(listBean.getNum()));

        OkHttp3Util.doPost(Api.UpDateCart_API, params, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //更新成功一条
                if (response.isSuccessful()) {
                    //索引增加
                    childIndex++;
                    if (childIndex < groupBean.getList().size()) {
                        //再去更新下一条
                        upDataAllChildInGroup(groupBean, checked);

                    } else {//全都更新完成了....重新查询购物车
                        cartPresenter.getData(Api.SELECTART_API);
                    }
                }

            }
        });
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ChildHolder holder;
        if (convertView == null){
            holder = new ChildHolder();
            convertView = View.inflate(context,R.layout.child_item,null);
            //找控件
            holder.child_check = convertView.findViewById(R.id.child_check);
            holder.child_image = convertView.findViewById(R.id.child_image);
            holder.child_title = convertView.findViewById(R.id.child_title);
            holder.child_price = convertView.findViewById(R.id.child_price);
            holder.child_jian = convertView.findViewById(R.id.child_jian);
            holder.child_num = convertView.findViewById(R.id.child_num);
            holder.child_jia = convertView.findViewById(R.id.child_jia);
            holder.child_del = convertView.findViewById(R.id.child_del);
            convertView.setTag(holder);
        }else {
            holder = (ChildHolder) convertView.getTag();
        }
        //赋值
        final CartBean.DataBean.ListBean childBean = cartBean.getData().get(groupPosition).getList().get(childPosition);
        holder.child_check.setChecked(childBean.getSelected() == 0 ? false:true);
        holder.child_title.setText(childBean.getTitle());
        String[] split = childBean.getImages().split("\\|");
        Glide.with(context).load(split[0]).into(holder.child_image);
        holder.child_price.setText("¥:"+childBean.getPrice());
        holder.child_num.setText(childBean.getNum()+"");
        //CheckBox的点击
        holder.child_check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击时先显示progressBar
                progressBar.setVisibility(View.VISIBLE);

                Map<String, String> params = new HashMap<>();

                params.put("uid", "2845");
                params.put("sellerid", String.valueOf(childBean.getSellerid()));
                params.put("pid", String.valueOf(childBean.getPid()));

                params.put("selected", String.valueOf(childBean.getSelected() == 0 ? 1 : 0));
                params.put("num", String.valueOf(childBean.getNum()));

                OkHttp3Util.doPost(Api.UpDateCart_API, params, new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        //更新成功之后,,,,再次查询购物车的数据进行展示
                        if (response.isSuccessful()) {
                            cartPresenter.getData(Api.SELECTART_API);
                        }
                    }
                });
            }
        });

        //加号的点击
        holder.child_jia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int num = childBean.getNum();

                //此时需要显示进度条
                progressBar.setVisibility(View.VISIBLE);
                //更新购物车,,,,需要改变是数量,,,,需要加1

                Map<String, String> params = new HashMap<>();

                //?uid=71&sellerid=1&pid=1&selected=0&num=10
                params.put("uid", "2845");
                params.put("sellerid", String.valueOf(childBean.getSellerid()));
                params.put("pid", String.valueOf(childBean.getPid()));
                params.put("selected", String.valueOf(childBean.getSelected()));

                params.put("num", String.valueOf(num + 1));

                OkHttp3Util.doPost(Api.UpDateCart_API, params, new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        //更新成功之后,,,,再次查询购物车的数据进行展示
                        if (response.isSuccessful()) {
                            cartPresenter.getData(Api.SELECTART_API);
                        }
                    }
                });
            }
        });

        //减号的点击
        holder.child_jian.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击加减时数据num也要改变
                int num = childBean.getNum();
                if (num == 1){//如果数据是1,就不能减了,不执行下面的逻辑
                    return;
                }

                //此时需要显示进度条
                progressBar.setVisibility(View.VISIBLE);
                //更新购物车,,,,需要改变是数量,,,,需要加1

                Map<String, String> params = new HashMap<>();

                //?uid=71&sellerid=1&pid=1&selected=0&num=10
                params.put("uid", "2845");
                params.put("sellerid", String.valueOf(childBean.getSellerid()));
                params.put("pid", String.valueOf(childBean.getPid()));
                params.put("selected", String.valueOf(childBean.getSelected()));

                params.put("num", String.valueOf(num - 1));

                OkHttp3Util.doPost(Api.UpDateCart_API, params, new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        //更新成功之后,,,,再次查询购物车的数据进行展示
                        if (response.isSuccessful()) {
                            cartPresenter.getData(Api.SELECTART_API);
                        }
                    }
                });
            }
        });

        //删除
        holder.child_del.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //显示进度条
                progressBar.setVisibility(View.VISIBLE);
                //调用删除的接口
                Map<String, String> params = new HashMap<>();

                //uid=72&pid=1
                params.put("uid", "2845");
                params.put("pid", String.valueOf(childBean.getPid()));

                OkHttp3Util.doPost(Api.DELETECART_API, params, new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        if (response.isSuccessful()) {
                            //再次请求购物车的数据
                            cartPresenter.getData(Api.SELECTART_API);

                        }
                    }
                });
            }
        });

        return convertView;
    }


    /**
     * 计算价钱和数量
     */
    public void sendPriceAndCount() {
        double price = 0;
        int count = 0;

        for (int i = 0; i < cartBean.getData().size(); i++) {
            List<CartBean.DataBean.ListBean> listBeans = cartBean.getData().get(i).getList();
            for (int j = 0; j < listBeans.size(); j++) {

                if (listBeans.get(j).getSelected() == 1) {
                    price += listBeans.get(j).getPrice() * listBeans.get(j).getNum();
                    count += listBeans.get(j).getNum();
                }
            }
        }

        //double高精度,,,计算的时候可能会出现一串数字...保留两位
        DecimalFormat decimalFormat = new DecimalFormat("0.00");
        String priceString = decimalFormat.format(price);
        CountPriceBean countPriceBean = new CountPriceBean(priceString, count);

        //发送到主页面进行显示
        Message msg = Message.obtain();

        msg.what = 0;
        msg.obj = countPriceBean;
        handler.sendMessage(msg);
    }

    /**
     * 全选反选的操作
     * @param checked
     */
    public void setAllCheck(boolean checked) {
        //创建一个大的结合,,,存放所有商品的数据
        List<CartBean.DataBean.ListBean> allList = new ArrayList<>();
        for (int i = 0; i < cartBean.getData().size(); i++) {
            List<CartBean.DataBean.ListBean> listBeans = cartBean.getData().get(i).getList();
            for (int j = 0; j < listBeans.size(); j++) {
                allList.add(listBeans.get(j));
            }
        }

        //显示progress
        progressBar.setVisibility(View.VISIBLE);

        //递归更新....
        allIndex = 0;
        upDateAllChecked(allList, checked);
    }

    /**
     * 更新选择的操作
     * @param allList
     * @param checked
     */
    private void upDateAllChecked(final List<CartBean.DataBean.ListBean> allList, final boolean checked) {
        CartBean.DataBean.ListBean listBean = allList.get(allIndex);
        Map<String, String> params = new HashMap<>();

        //?uid=71&sellerid=1&pid=1&selected=0&num=10
        params.put("uid", "2845");
        params.put("sellerid", String.valueOf(listBean.getSellerid()));
        params.put("pid", String.valueOf(listBean.getPid()));

        params.put("selected", String.valueOf(checked ? 1 : 0));
        params.put("num", String.valueOf(listBean.getNum()));

        OkHttp3Util.doPost(Api.UpDateCart_API, params, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //更新一条成功
                if (response.isSuccessful()) {
                    allIndex++;

                    if (allIndex < allList.size()) {
                        //继续更新下一条
                        upDateAllChecked(allList, checked);
                    } else {
                        //重新查询
                        cartPresenter.getData(Api.SELECTART_API);
                    }

                }
            }
        });
    }

    public class GroupHolder{
        CheckBox group_check;
        TextView group_text;
   }
   public class ChildHolder{
        CheckBox child_check;
        ImageView child_image;
        TextView child_title;
        TextView child_price;
        TextView child_jian;
        TextView child_num;
        TextView child_jia;
        Button child_del;
   }
}
OK!到了这里之后,我们要的效果就出来了,还行吧!
仿京东购物车Deom