购物车实现逻辑

购物车bean类
public class MyShoppingCarBean {

    /**
     * msg : 请求成功
     * code : 0
     * data : [{"list":[{"bargainPrice":11800,"createtime":"2017-10-10T17:33:37","detailUrl":"https://item.m.jd.com/product/4338107.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t6700/155/2098998076/156185/6cf95035/595dd5a5Nc3a7dab5.jpg!q70.jpg","num":2,"pid":57,"price":5199,"pscid":40,"selected":0,"sellerid":1,"subhead":"【i5 MX150 2G显存】全高清窄边框 8G内存 256固态硬盘 支持指纹识别 预装WIN10系统","title":"小米(MI)Air 13.3英寸全金属轻薄笔记本(i5-7200U 8G 256G PCle SSD MX150 2G独显 FHD 指纹识别 Win10)银\r\n"},{"bargainPrice":99,"createtime":"2017-10-14T21:38:26","detailUrl":"https://item.m.jd.com/product/4345173.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t6037/35/2944615848/95178/6cd6cff0/594a3a10Na4ec7f39.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t6607/258/1025744923/75738/da120a2d/594a3a12Ne3e6bc56.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t6370/292/1057025420/64655/f87644e3/594a3a12N5b900606.jpg!q70.jpg","num":1,"pid":45,"price":2999,"pscid":39,"selected":0,"sellerid":1,"subhead":"高清双摄,就是清晰!2000+1600万高清摄像头,6GB大内存+高通骁龙835处理器,性能怪兽!","title":"一加手机5 (A5000) 6GB+64GB 月岩灰 全网通 双卡双待 移动联通电信4G手机"}],"sellerName":"商家1","sellerid":"1"},{"list":[{"bargainPrice":11800,"createtime":"2017-10-14T21:38:26","detailUrl":"https://item.m.jd.com/product/5025518.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t8830/106/1760940277/195595/5cf9412f/59bf2ef5N5ab7dc16.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5428/70/1520969931/274676/b644dd0d/591128e7Nd2f70da0.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5566/365/1519564203/36911/620c750c/591128eaN54ac3363.jpg!q70.jpg","num":5,"pid":58,"price":6399,"pscid":40,"selected":0,"sellerid":2,"subhead":"升级4G大显存!Nvme协议Pcie SSD,速度快人一步】GTX1050Ti就选拯救者!专业游戏键盘&新模具全新设计!","title":"联想(Lenovo)拯救者R720 15.6英寸游戏笔记本电脑(i5-7300HQ 8G 1T+128G SSD GTX1050Ti 4G IPS 黑)"},{"bargainPrice":6666,"createtime":"2017-10-10T16:01:31","detailUrl":"https://item.m.jd.com/product/5089273.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t8284/363/1326459580/71585/6d3e8013/59b857f2N6ca75622.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t9346/182/1406837243/282106/68af5b54/59b8480aNe8af7f5c.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8434/54/1359766007/56140/579509d9/59b85801Nfea207db.jpg!q70.jpg","num":2,"pid":46,"price":234,"pscid":39,"selected":0,"sellerid":2,"subhead":"【iPhone新品上市】新一代iPhone,让智能看起来更不一样","title":"Apple iPhone 8 Plus (A1864) 64GB 金色 移动联通电信4G手机"}],"sellerName":"商家2","sellerid":"2"},{"list":[{"bargainPrice":1999,"createtime":"2017-10-10T16:09:02","detailUrl":"https://item.m.jd.com/product/5025971.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t7210/232/3738666823/232298/9004583e/59c3a9a7N8de42e15.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8356/82/2107423621/109733/c019b8c6/59c3a9a6Ne9a4bdd7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t10219/74/25356012/171379/7d55e296/59c3a9a8N82fa6e02.jpg!q70.jpg","num":1,"pid":49,"price":333,"pscid":39,"selected":0,"sellerid":5,"subhead":"vivo X20 带你开启全面屏时代!逆光也清晰,照亮你的美!","title":"vivo X20 全面屏手机 全网通 4GB+64GB 金色 移动联通电信4G手机 双卡双待"}],"sellerName":"商家5","sellerid":"5"},{"list":[{"bargainPrice":3455,"createtime":"2017-10-03T23:53:28","detailUrl":"https://item.m.jd.com/product/12224420750.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8803/356/1478945529/489755/2a163ace/59ba5e84N7bb9a666.jpg!q70.jpg","num":5,"pid":52,"price":666,"pscid":39,"selected":0,"sellerid":8,"subhead":"【现货新品抢购】全面屏2.0震撼来袭,骁龙835处理器,四曲面陶瓷机","title":"小米(MI) 小米MIX2 手机 黑色 全网通 (6GB+64GB)【标配版】"}],"sellerName":"商家8","sellerid":"8"}]
     */

    private String msg;
    private String code;
    private List<DataBean> data;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public static class DataBean {
        /**
         * list : [{"bargainPrice":11800,"createtime":"2017-10-10T17:33:37","detailUrl":"https://item.m.jd.com/product/4338107.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t6700/155/2098998076/156185/6cf95035/595dd5a5Nc3a7dab5.jpg!q70.jpg","num":2,"pid":57,"price":5199,"pscid":40,"selected":0,"sellerid":1,"subhead":"【i5 MX150 2G显存】全高清窄边框 8G内存 256固态硬盘 支持指纹识别 预装WIN10系统","title":"小米(MI)Air 13.3英寸全金属轻薄笔记本(i5-7200U 8G 256G PCle SSD MX150 2G独显 FHD 指纹识别 Win10)银\r\n"},{"bargainPrice":99,"createtime":"2017-10-14T21:38:26","detailUrl":"https://item.m.jd.com/product/4345173.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t6037/35/2944615848/95178/6cd6cff0/594a3a10Na4ec7f39.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t6607/258/1025744923/75738/da120a2d/594a3a12Ne3e6bc56.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t6370/292/1057025420/64655/f87644e3/594a3a12N5b900606.jpg!q70.jpg","num":1,"pid":45,"price":2999,"pscid":39,"selected":0,"sellerid":1,"subhead":"高清双摄,就是清晰!2000+1600万高清摄像头,6GB大内存+高通骁龙835处理器,性能怪兽!","title":"一加手机5 (A5000) 6GB+64GB 月岩灰 全网通 双卡双待 移动联通电信4G手机"}]
         * sellerName : 商家1
         * sellerid : 1
         */

        private String sellerName;
        private String sellerid;
        private List<ListBean> list;
        private boolean isGroupChoosed;
//判断商家是否选中
        public boolean isGroupChoosed() {
            return isGroupChoosed;
        }

        public void setGroupChoosed(boolean groupChoosed) {
            isGroupChoosed = groupChoosed;
        }

        public String getSellerName() {
            return sellerName;
        }

        public void setSellerName(String sellerName) {
            this.sellerName = sellerName;
        }

        public String getSellerid() {
            return sellerid;
        }

        public void setSellerid(String sellerid) {
            this.sellerid = sellerid;
        }

        public List<ListBean> getList() {
            return list;
        }

        public void setList(List<ListBean> list) {
            this.list = list;
        }

        public static class ListBean {
            /**
             * bargainPrice : 11800
             * createtime : 2017-10-10T17:33:37
             * detailUrl : https://item.m.jd.com/product/4338107.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends
             * images : https://m.360buyimg.com/n0/jfs/t6700/155/2098998076/156185/6cf95035/595dd5a5Nc3a7dab5.jpg!q70.jpg
             * num : 2
             * pid : 57
             * price : 5199
             * pscid : 40
             * selected : 0
             * sellerid : 1
             * subhead : 【i5 MX150 2G显存】全高清窄边框 8G内存 256固态硬盘 支持指纹识别 预装WIN10系统
             * title : 小米(MI)Air 13.3英寸全金属轻薄笔记本(i5-7200U 8G 256G PCle SSD MX150 2G独显 FHD 指纹识别 Win10)银

             */

            private String bargainPrice;
            private String createtime;
            private String detailUrl;
            private String images;
            private String num;
            private String pid;
            private String price;
            private String pscid;
            private String selected;
            private String sellerid;
            private String subhead;
            private String title;
            //判断商品是否选中
            private boolean isChildChoosed;

            public boolean isChildChoosed() {
                return isChildChoosed;
            }

            public void setChildChoosed(boolean childChoosed) {
                isChildChoosed = childChoosed;
            }
            public String getBargainPrice() {
                return bargainPrice;
            }

            public void setBargainPrice(String bargainPrice) {
                this.bargainPrice = bargainPrice;
            }

            public String getCreatetime() {
                return createtime;
            }

            public void setCreatetime(String createtime) {
                this.createtime = createtime;
            }

            public String getDetailUrl() {
                return detailUrl;
            }

            public void setDetailUrl(String detailUrl) {
                this.detailUrl = detailUrl;
            }

            public String getImages() {
                return images;
            }

            public void setImages(String images) {
                this.images = images;
            }

            public String getNum() {
                return num;
            }

            public void setNum(String num) {
                this.num = num;
            }

            public String getPid() {
                return pid;
            }

            public void setPid(String pid) {
                this.pid = pid;
            }

            public String getPrice() {
                return price;
            }

            public void setPrice(String price) {
                this.price = price;
            }

            public String getPscid() {
                return pscid;
            }

            public void setPscid(String pscid) {
                this.pscid = pscid;
            }

            public String getSelected() {
                return selected;
            }

            public void setSelected(String selected) {
                this.selected = selected;
            }

            public String getSellerid() {
                return sellerid;
            }

            public void setSellerid(String sellerid) {
                this.sellerid = sellerid;
            }

            public String getSubhead() {
                return subhead;
            }

            public void setSubhead(String subhead) {
                this.subhead = subhead;
            }

            public String getTitle() {
                return title;
            }

            public void setTitle(String title) {
                this.title = title;
            }
        }
    }
}
model层接口

public interface ShoppingCarModdel {
    void getData(String url, Map<String, String> map);

}

实现类

public class MyShopoingCarModel implements ShoppingCarModdel {
    private OnFinishShoppingCarLisenner onFinishShoppingCarLisenner;

    public void setOnFinishShoppingCarLisenner(OnFinishShoppingCarLisenner onFinishShoppingCarLisenner) {
        this.onFinishShoppingCarLisenner = onFinishShoppingCarLisenner;
    }

    public interface OnFinishShoppingCarLisenner{
        void onFinishShoppingCar(MyShoppingCarBean myShoppingCarBean);
    }

    @Override
    public void getData(String url, Map<String, String> map) {
        OkHttp3Utils.doPost(url, map, new GsonObjectCallback<MyShoppingCarBean>() {
            @Override
            public void onUi(MyShoppingCarBean myShoppingCarBean) {
              //  Log.e("数据",regBean.getMsg());
                if (onFinishShoppingCarLisenner!=null){
                    onFinishShoppingCarLisenner.onFinishShoppingCar(myShoppingCarBean);
                }
            }

            @Override
            public void onFailed(Call call, IOException e) {

            }
        });
    }
}

p层


public class MyShoppingCarPresenter implements MyShopoingCarModel.OnFinishShoppingCarLisenner {
    private MyShopoingCarModel myShopoingCarModel;
    private ShoppingCarView shoppingCarView;

    public MyShoppingCarPresenter(ShoppingCarView shoppingCarView) {
        this.shoppingCarView = shoppingCarView;
        this.myShopoingCarModel =new MyShopoingCarModel();
    }

    public void getData(String url, Map<String,String> map){

        myShopoingCarModel.setOnFinishShoppingCarLisenner(this);
        myShopoingCarModel.getData(url,map);
    }

    @Override
    public void onFinishShoppingCar(MyShoppingCarBean myShoppingCarBean) {
        String code = myShoppingCarBean.getCode();
        if (code.equals("0")){
            shoppingCarView.issucceed(myShoppingCarBean);
        }else{
            shoppingCarView.isdefeated(myShoppingCarBean);
        }
    }
}
view接口

public interface ShoppingCarView {
    void issucceed(MyShoppingCarBean myShoppingCarBean);
    void isdefeated(MyShoppingCarBean myShoppingCarBean);

}
fragment --view层


public class Fragment3 extends Fragment implements DingDanView,ShoppingCarView,MyShoppingCarAdapter.CheckGroupItemListener,MyShoppingCarAdapter.ModifyGoodsItemNumberListener {

    private View inflate;
    private TextView textCar;
    private ExpandableListView expandList;
    private List<MyShoppingCarBean.DataBean> data;
    private TextView tvTotalPrice;
    private TextView btnAmount;
    private TextView btnEditor;
    private CheckBox btnCheckAll;
    //购买商品的总数量
    private int totalNum = 0;
    //购买商品的总价
    private double totalPrice= 0.00; //15.55  15  0.55亿
    private MyShoppingCarPresenter myShoppingCarPresenter;
    private MyShoppingCarAdapter adapter;
    private String uid="4064";
    private MyDingDanPresenter myDingDanPresenter;
    private double sum;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        inflate = inflater.from(getActivity()).inflate(R.layout.fragment3, container, false);
        myShoppingCarPresenter = new MyShoppingCarPresenter(this);
        myDingDanPresenter = new MyDingDanPresenter(this);
        return inflate;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initView();
        Map<String, String> map = new HashMap<>();
        map.put("uid",uid);
       // map.put("source", "android");
        if(myShoppingCarPresenter!=null) {
            myShoppingCarPresenter.getData(MyApi.GETCARTS, map);
        }


    }

    private void initView() {
        textCar = inflate.findViewById(R.id.textCar);
        expandList = inflate.findViewById(R.id.expandList);
        //去除默认指示器
        expandList.setGroupIndicator(null);

        adapter = new MyShoppingCarAdapter(getActivity());
        //设置商品加减的监听
        adapter.setModifyGoodsItemNumberListener(this);
        //设置商家以及商品是否被选中的监听
        adapter.setCheckGroupItemListener(this);

        expandList.setAdapter(adapter);
        //购物车底部栏的全选框
        btnCheckAll = (CheckBox)inflate.findViewById(R.id.btnCheckAll);
        btnCheckAll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                isChoosedAll(((CheckBox)view).isChecked());
                //计算商品总价
                statisticsPrice();

            }
        });
        //合计,计算总价
        tvTotalPrice = (TextView)inflate.findViewById(R.id.tvTotalPrice);
        //结算按钮
        btnAmount = (TextView)inflate.findViewById(R.id.btnAmount);
        //结算按钮设置监听
        btnAmount.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               // String tvPrice = tvTotalPrice.getText().toString();
                //Log.e("价格",tvPrice);
                if (sum!=0.00){

                    Map<String,String> map=new HashMap<>();
                    map.put("uid",uid);
                    map.put("price",String.valueOf(sum));
                    myDingDanPresenter.getData(MyApi.CREATEORDER,map);
                   // Toast.makeText(getActivity(),sum+"",Toast.LENGTH_SHORT).show();

                }else {
                    Toast.makeText(getActivity(),"目前没有选择商品",Toast.LENGTH_SHORT).show();
                }

            }
        });

        //找到编辑控件
        btnEditor = (TextView)inflate.findViewById(R.id.btnEditor);
        //设置用户登录监听
    }






    //二级列表默认展开
    private void defaultExpand(){

        for (int i = 0; i < adapter.getGroupCount();++i){
            expandList.expandGroup(i);
        }

    }
        //获取商品信息成功
    @Override
    public void issucceed(MyShoppingCarBean myShoppingCarBean) {
        data = myShoppingCarBean.getData();
        adapter.setList(data);
        defaultExpand();

    }
        //获取商品数据失败
    @Override
    public void isdefeated(MyShoppingCarBean myShoppingCarBean) {

    }
        //点击商家列表走的监听
    @Override
    public void checkGroupItem(int groupPosition, boolean isChecked) {
        //Toast.makeText(this, "商家", Toast.LENGTH_SHORT).show();
        //商家javabean
        MyShoppingCarBean.DataBean dataBean = data.get(groupPosition);
        dataBean.setGroupChoosed(isChecked);
        //遍历商家里面的商品,将其置为选中状态
        for (MyShoppingCarBean.DataBean.ListBean listBean : dataBean.getList()){
            listBean.setChildChoosed(isChecked);
        }

        //底部结算那个checkbox状态(全选)
        if(isCheckAll()){
            btnCheckAll.setChecked(true);
        }else{
            btnCheckAll.setChecked(false);
        }

        //刷新适配器
        adapter.notifyDataSetChanged();

        //计算价格
        statisticsPrice();
    }
        //店家商品列表的监听
    @Override
    public void checkChildItem(int groupPosition, int childPosition, boolean isChecked) {
        MyShoppingCarBean.DataBean dataBean = data.get(groupPosition);//商家那一层
        List<MyShoppingCarBean.DataBean.ListBean> listBeans = dataBean.getList();
        MyShoppingCarBean.DataBean.ListBean listBean = listBeans.get(childPosition);

        //你点击商家的商品条目将其选中状态记录
        listBean.setChildChoosed(isChecked);

        //检测商家里面的每一个商品是否被选中,如果被选中,返回boolean
        boolean result = isGoodsCheckAll(groupPosition);
        if(result){
            dataBean.setGroupChoosed(result);
        }else{
            dataBean.setGroupChoosed(result);
        }

        //底部结算那个checkbox状态(全选)
        if(isCheckAll()){
            btnCheckAll.setChecked(true);
        }else{
            btnCheckAll.setChecked(false);
        }


        //刷新适配器
        adapter.notifyDataSetChanged();

        //计算总价
        statisticsPrice();
    }
        //点击加号的监听
    @Override
    public void doIncrease(int groupPosition, int childPosition, View view) {
        MyShoppingCarBean.DataBean.ListBean listBean = data.get(groupPosition).getList().get(childPosition);
        //取出当前的商品数量
        int currentNum = Integer.valueOf(listBean.getNum());
        //商品++
        currentNum++;
        //将商品数量设置javabean上
        listBean.setNum(String.valueOf(currentNum));

        //刷新适配器
        adapter.notifyDataSetChanged();


        //计算商品价格
        statisticsPrice();
    }
        //点击减号的监听
    @Override
    public void doDecrease(int groupPosition, int childPosition, View view) {

        MyShoppingCarBean.DataBean.ListBean listBean = data.get(groupPosition).getList().get(childPosition);
        //取出当前的商品数量
        int currentNum = Integer.valueOf(listBean.getNum());
        //直接结束这个方法
        if(currentNum == 1){
            return;
        }

        currentNum--;
        listBean.setNum(String.valueOf(currentNum));
        //刷新适配器
        adapter.notifyDataSetChanged();

        //计算商品价格
        statisticsPrice();

    }
    /**
     * 检测某个商家的商品是否都选中,如果都选中的话,商家CheckBox应该是选中状态
     * @param groupPosition
     * @return
     */
    private boolean isGoodsCheckAll(int groupPosition){
        List<MyShoppingCarBean.DataBean.ListBean> listBeans = this.data.get(groupPosition).getList();
        //遍历某一个商家的每个商品是否被选中
        for (MyShoppingCarBean.DataBean.ListBean listBean : listBeans){
            if(listBean.isChildChoosed()){//是选中状态
                continue;
            }else{
                return false;
            }

        }

        return true;
    }
    private boolean isCheckAll(){

        for (MyShoppingCarBean.DataBean dataBean : data){
            if(!dataBean.isGroupChoosed()){
                return false;
            }
        }
        return true;
    }
    //全选与反选
    private void isChoosedAll(boolean isChecked){

        for (MyShoppingCarBean.DataBean dataBean : data){
            dataBean.setGroupChoosed(isChecked);
            for (MyShoppingCarBean.DataBean.ListBean listBean : dataBean.getList()){
                listBean.setChildChoosed(isChecked);
            }
        }
        //刷新适配器
        adapter.notifyDataSetChanged();

    }



    private void statisticsPrice(){
        //初始化值
        totalNum = 0;
        totalPrice = 0.00;


        for (MyShoppingCarBean.DataBean dataBean : data){

            for (MyShoppingCarBean.DataBean.ListBean listBean : dataBean.getList()) {
                if (listBean.isChildChoosed()) {
                    totalNum+=Integer.valueOf(listBean.getNum());
                    totalPrice += Integer.valueOf(listBean.getNum()) *Double.valueOf(listBean.getPrice());
                }
            }
        }
        //设置文本信息 合计、结算的商品数量
        tvTotalPrice.setText("合计:¥"+totalPrice);
        sum = totalPrice;
        btnAmount.setText("结算("+totalNum+")");



    }
        //创建订单成功
    @Override
    public void issucceed(CreateDengDanBean createDengDanBean) {
        Toast.makeText(getActivity(),createDengDanBean.getMsg(),Toast.LENGTH_SHORT).show();

    }
        //创建订单失败
    @Override
    public void isdefeated(CreateDengDanBean createDengDanBean) {
        Toast.makeText(getActivity(),createDengDanBean.getMsg(),Toast.LENGTH_SHORT).show();
    }
}
添加购物车

public class AddCarBean {

    /**
     * msg : 加购成功
     * code : 0
     */

    private String msg;
    private String code;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}
model层接口

public interface AddCarModdel {
    void getData(String url, Map<String, String> map);
}
实现类
public class MyAddCarModel implements AddCarModdel {
    private OnFinishAddCarLisenner onFinishAddCarLisenner;



    public void setOnFinishAddCarLisenner(OnFinishAddCarLisenner onFinishAddCarLisenner) {
        this.onFinishAddCarLisenner = onFinishAddCarLisenner;
    }

    public interface OnFinishAddCarLisenner{
        void onFinishAddCar(AddCarBean addCarBean);
    }

    @Override
    public void getData(String url, Map<String, String> map) {
        OkHttp3Utils.doPost(url, map, new GsonObjectCallback<AddCarBean>() {
            @Override
            public void onUi(AddCarBean addCarBean) {
              //  Log.e("数据",regBean.getMsg());
                if (onFinishAddCarLisenner!=null){
                    onFinishAddCarLisenner.onFinishAddCar(addCarBean);
                }
            }

            @Override
            public void onFailed(Call call, IOException e) {

            }
        });
    }
}

p层

public class MyAddCarPresenter implements MyAddCarModel.OnFinishAddCarLisenner {
    private MyAddCarModel myAddCarModel;
    private AddCarView addCarView;

    public MyAddCarPresenter(AddCarView addCarView) {
        this.addCarView = addCarView;
        this.myAddCarModel =new MyAddCarModel();
    }

    public void getData(String url, Map<String,String> map){

        myAddCarModel.setOnFinishAddCarLisenner(this);
        myAddCarModel.getData(url,map);
    }

    @Override
    public void onFinishAddCar(AddCarBean addCarBean) {
        String code = addCarBean.getCode();
        if (code.equals("0")){
            addCarView.issucceed(addCarBean);
        }else{
            addCarView.isdefeated(addCarBean);
        }
    }
}
view接口

public interface AddCarView {
    void issucceed(AddCarBean addCarBean);
    void isdefeated(AddCarBean addCarBean);

}
adapter适配器


public class MyShoppingCarAdapter extends BaseExpandableListAdapter {



        private List<MyShoppingCarBean.DataBean> data;
        private Context context;
        //商品加减的一个接口变量
        private ModifyGoodsItemNumberListener modifyGoodsItemNumberListener;
        private CheckGroupItemListener checkGroupItemListener;
        //接收是否处于编辑状态的一个boolean值
        private boolean isEditor;

        public MyShoppingCarAdapter(Context context){
            this.context = context;
        }


        //设置数据
        public void setList(List<MyShoppingCarBean.DataBean> data){
            this.data = data;
            notifyDataSetChanged();
        }


        //商家以及商品是否被选中的一个监听
        public void setCheckGroupItemListener(CheckGroupItemListener checkGroupItemListener){
            this.checkGroupItemListener = checkGroupItemListener;
        }

        //设置商品的加减监听
        public void setModifyGoodsItemNumberListener(ModifyGoodsItemNumberListener modifyGoodsItemNumberListener){
            this.modifyGoodsItemNumberListener = modifyGoodsItemNumberListener;
        }

        //是否显示删除按钮
        public void showDeleteButton(boolean isEditor){
            this.isEditor = isEditor;
            //刷新适配器
            notifyDataSetChanged();
        }

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

        @Override
        public int getChildrenCount(int i) {
            return data != null && data.get(i).getList() != null ? data.get(i).getList().size() : 0;
        }

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

        @Override
        public Object getChild(int groupPosition, int childPosition) {
            return data.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 false;
        }

        @Override
        public View getGroupView(final int groupPosition, boolean b, View convertView, ViewGroup parent) {

            if(convertView == null){

                convertView = LayoutInflater.from(context).inflate(R.layout.layout_group_item,parent,false);
            }

            //查找控件
            CheckBox ck_group_choosed = convertView.findViewById(R.id.ck_group_choosed);

            //设置商家checkbox复选框的状态
            if(data.get(groupPosition).isGroupChoosed()){
                ck_group_choosed.setChecked(true);
            }else{
                ck_group_choosed.setChecked(false);
            }

            //ck_group_choosed.setChan
            ck_group_choosed.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    checkGroupItemListener.checkGroupItem(groupPosition,((CheckBox)view).isChecked());

                }
            });


            //赋值
            ck_group_choosed.setText(data.get(groupPosition).getSellerName());


            return convertView;
        }

        @Override
        public View getChildView(final int groupPosition, final int childPosition, boolean b, View convertView, ViewGroup parent) {

            if(convertView == null){
                convertView = LayoutInflater.from(context).inflate(R.layout.layout_child_item,parent,false);
            }

            //商品选择
            CheckBox ck_child_choosed = convertView.findViewById(R.id.ck_child_choose);
            //商品图片
            ImageView iv_show_pic = convertView.findViewById(R.id.iv_show_pic);
            //商品主标题
            TextView tv_commodity_name = convertView.findViewById(R.id.tv_commodity_name);
            //商品副标题
            TextView tv_commodity_attr = convertView.findViewById(R.id.tv_commodity_attr);
            //商品价格
            TextView tv_commodity_price = convertView.findViewById(R.id.tv_commodity_price);
            //商品数量
            TextView tv_commodity_num = convertView.findViewById(R.id.tv_commodity_num);
            //商品减
            TextView iv_sub = convertView.findViewById(R.id.iv_sub);
            //商品加减中的数量变化
            final TextView tv_commodity_show_num = convertView.findViewById(R.id.tv_commodity_show_num);
            //商品加
            TextView iv_add = convertView.findViewById(R.id.iv_add);
            //删除按钮
            Button btn_commodity_delete = convertView.findViewById(R.id.btn_commodity_delete);

            //设置文本信息
            tv_commodity_name.setText(data.get(groupPosition).getList().get(childPosition).getTitle());
            tv_commodity_attr.setText(data.get(groupPosition).getList().get(childPosition).getSubhead());
            tv_commodity_price.setText("¥"+data.get(groupPosition).getList().get(childPosition).getPrice());
            tv_commodity_num.setText("x"+data.get(groupPosition).getList().get(childPosition).getNum());
            tv_commodity_show_num.setText(data.get(groupPosition).getList().get(childPosition).getNum()+"");

            //分割图片地址
            String images = data.get(groupPosition).getList().get(childPosition).getImages();

            String[] urls = images.split("\\|");


            //加载商品图片
            Glide.with(context)
                    .load(urls[0])
                    .crossFade()
                    .into(iv_show_pic);

            //商品加
            iv_add.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    modifyGoodsItemNumberListener.doIncrease(groupPosition,childPosition,tv_commodity_show_num);
                }
            });

            //设置商品加减的按钮
            //商品减
            iv_sub.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    modifyGoodsItemNumberListener.doDecrease(groupPosition,childPosition,tv_commodity_show_num);

                }
            });

            //商品复选框是否被选中
            ck_child_choosed.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //isChecked false  true
                    checkGroupItemListener.checkChildItem(groupPosition,childPosition,((CheckBox)view).isChecked());
                }
            });

            //处理商品的选中状态
            if(data.get(groupPosition).getList().get(childPosition).isChildChoosed()){
                ck_child_choosed.setChecked(true);
            }else{
                ck_child_choosed.setChecked(false);
            }

            //控制删除按钮的隐藏与显示
            if(isEditor){
                btn_commodity_delete.setVisibility(View.VISIBLE);
            }else{
                btn_commodity_delete.setVisibility(View.GONE);
            }


            return convertView;
        }

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


        /**
         * 商家的复选框以及商品的复选框是否被选中的接口
         */
        /**
         * 商家复选框以及商品复选框是否被选中接口
         */
        public interface CheckGroupItemListener{
            //商家的条目的复选框监听
            void checkGroupItem(int groupPosition,boolean isChecked);
            //商品的
            void checkChildItem(int groupPosition,int childPosition,boolean isChecked);


        }

        /**
         * 商品加减接口
         */
        public interface ModifyGoodsItemNumberListener{

            //商品添加操作
            void doIncrease(int groupPosition,int childPosition,View view);
            //商品减少操作
            void doDecrease(int groupPosition,int childPosition,View view);

        }


    }


工具类

/**
 * 1. 类的用途 封装OkHttp3的工具类 用单例设计模式
 * 2. @author forever
 * 3. @date 2017/9/6 09:19
 */

public class OkHttp3Utils {
    /**
     * 懒汉 安全 加同步
     * 私有的静态成员变量 只声明不创建
     * 私有的构造方法
     * 提供返回实例的静态方法
     */

    private static OkHttp3Utils okHttp3Utils = null;

    private OkHttp3Utils() {
    }

    public static OkHttp3Utils getInstance() {
        if (okHttp3Utils == null) {
            //加同步安全
            synchronized (OkHttp3Utils.class) {
                if (okHttp3Utils == null) {
                    okHttp3Utils = new OkHttp3Utils();
                }
            }

        }

        return okHttp3Utils;
    }

    private static OkHttpClient okHttpClient = null;

    public synchronized static OkHttpClient getOkHttpClient() {
        if (okHttpClient == null) {
            //判空 为空创建实例
            // okHttpClient = new OkHttpClient();
/**
 * 和OkHttp2.x有区别的是不能通过OkHttpClient直接设置超时时间和缓存了,而是通过OkHttpClient.Builder来设置,
 * 通过builder配置好OkHttpClient后用builder.build()来返回OkHttpClient,
 * 所以我们通常不会调用new OkHttpClient()来得到OkHttpClient,而是通过builder.build():
 */
            //  File sdcache = getExternalCacheDir();
            //缓存目录
            File sdcache = new File(Environment.getExternalStorageDirectory(), "cache");
            int cacheSize = 10 * 1024 * 1024;
            //OkHttp3拦截器
            HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
                @Override
                public void log(String message) {
                    Log.i("xxx", message.toString());
                }
            });
            //Okhttp3的拦截器日志分类 4种
            httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);


            okHttpClient = new OkHttpClient.Builder().connectTimeout(15, TimeUnit.SECONDS)
                    //添加OkHttp3的拦截器
                    .addInterceptor(httpLoggingInterceptor)
                    .addNetworkInterceptor(new CacheInterceptor())
                    .writeTimeout(20, TimeUnit.SECONDS).readTimeout(20, TimeUnit.SECONDS)
                    .cache(new Cache(sdcache.getAbsoluteFile(), cacheSize))
                    .build();
        }
        return okHttpClient;
    }

    private static Handler mHandler = null;

    public synchronized static Handler getHandler() {
        if (mHandler == null) {
            mHandler = new Handler();
        }

        return mHandler;
    }

    /**
     * get请求
     * 参数1 url
     * 参数2 回调Callback
     */

    public static void doGet(String url, Callback callback) {

        //创建OkHttpClient请求对象
        OkHttpClient okHttpClient = getOkHttpClient();
        //创建Request
        Request request = new Request.Builder().url(url).build();
        //得到Call对象
        Call call = okHttpClient.newCall(request);
        //执行异步请求
        call.enqueue(callback);


    }

    /**
     * post请求
     * 参数1 url
     * 参数2 回调Callback
     */

    public static void doPost(String url, Map<String, String> params, Callback callback) {

        //创建OkHttpClient请求对象
        OkHttpClient okHttpClient = getOkHttpClient();
        //3.x版本post请求换成FormBody 封装键值对参数

        FormBody.Builder builder = new FormBody.Builder();
        //遍历集合
        for (String key : params.keySet()) {
            builder.add(key, params.get(key));

        }
        builder.add("source", "android");


        //创建Request
        Request request = new Request.Builder().url(url).post(builder.build()).build();

        Call call = okHttpClient.newCall(request);
        call.enqueue(callback);

    }

    /**
     * post请求上传文件
     * 参数1 url
     * 参数2 回调Callback
     */
    public static void upLoadFile(String path, Map<String, Object> params, Callback callback) {

        //创建OkHttpClient请求对象
        OkHttpClient okHttpClient = getOkHttpClient();


        MultipartBody.Builder builder = new MultipartBody.Builder();
        //设设置类型 以表单的形式提交
        builder.setType(MultipartBody.FORM);

        for (Map.Entry<String, Object> entry : params.entrySet()) {

            Object object = entry.getValue();
            if (!(object instanceof File)) {
                builder.addFormDataPart(entry.getKey(), object.toString());
            } else {
                File file = (File) object;
                builder.addFormDataPart(entry.getKey(), file.getName().trim(),
                        RequestBody.create(MediaType.parse("img/png"), file));

                //img/png -> application/octet-stream
            }
        }

        Request request = new Request.Builder()
                .post(builder.build())
                .url(path)
                .build();

        Call call = okHttpClient.newCall(request);
        call.enqueue(callback);
    }

    public static void uploadPic(String url, File file, String fileName) {
        //创建OkHttpClient请求对象
        OkHttpClient okHttpClient = getOkHttpClient();
        //创建RequestBody 封装file参数
        RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
        //创建RequestBody 设置类型等
        RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", fileName, fileBody).build();

        //创建Request
        Request request = new Request.Builder().url(url).post(requestBody).build();

        //得到Call
        Call call = okHttpClient.newCall(request);
        //执行请求
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //上传成功回调 目前不需要处理
                Log.e("上传", response.toString());
            }
        });

    }

    /**
     * Post请求发送JSON数据
     * 参数一:请求Url
     * 参数二:请求的JSON
     * 参数三:请求回调
     */
    public static void doPostJson(String url, String jsonParams, Callback callback) {
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonParams);
        Request request = new Request.Builder().url(url).post(requestBody).build();
        Call call = getOkHttpClient().newCall(request);
        call.enqueue(callback);


    }

    /**
     * 下载文件 以流的形式把apk写入的指定文件 得到file后进行安装
     * 参数一:请求Url
     * 参数二:保存文件的路径名
     * 参数三:保存文件的文件名
     */
    public static void download(final Context context, final String url, final String saveDir) {
        Request request = new Request.Builder().url(url).build();
        Call call = getOkHttpClient().newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.i("xxx", e.toString());
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {

                InputStream is = null;
                byte[] buf = new byte[2048];
                int len = 0;
                FileOutputStream fos = null;
                try {
                    is = response.body().byteStream();
                    //apk保存路径
                    final String fileDir = isExistDir(saveDir);
                    //文件
                    File file = new File(fileDir, getNameFromUrl(url));
                    fos = new FileOutputStream(file);
                    while ((len = is.read(buf)) != -1) {
                        fos.write(buf, 0, len);
                    }
                    fos.flush();
                    //apk下载完成后 调用系统的安装方法
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
                    context.startActivity(intent);
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (is != null) is.close();
                    if (fos != null) fos.close();


                }
            }
        });

    }

    /**
     * @param saveDir
     * @return
     * @throws IOException 判断下载目录是否存在
     */
    public static String isExistDir(String saveDir) throws IOException {
        // 下载位置
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

            File downloadFile = new File(Environment.getExternalStorageDirectory(), saveDir);
            if (!downloadFile.mkdirs()) {
                downloadFile.createNewFile();
            }
            String savePath = downloadFile.getAbsolutePath();
            Log.e("savePath", savePath);
            return savePath;
        }
        return null;
    }

    /**
     * @param url
     * @return 从下载连接中解析出文件名
     */
    private static String getNameFromUrl(String url) {
        return url.substring(url.lastIndexOf("/") + 1);
    }

    /**
     * 为okhttp添加缓存,这里是考虑到服务器不支持缓存时,从而让okhttp支持缓存
     */
    private static class CacheInterceptor implements Interceptor {
        @Override
        public Response intercept(Chain chain) throws IOException {
            // 有网络时 设置缓存超时时间1个小时
            int maxAge = 60 * 60;
            // 无网络时,设置超时为1天
            int maxStale = 60 * 60 * 24;
            Request request = chain.request();
            if (NetWorkUtils.isNetWorkAvailable(MyApp.getInstance())) {
                //有网络时只从网络获取
                request = request.newBuilder().cacheControl(CacheControl.FORCE_NETWORK).build();
            } else {
                //无网络时只从缓存中读取
                request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();
               /* Looper.prepare();
                Toast.makeText(MyApp.getInstance(), "走拦截器缓存", Toast.LENGTH_SHORT).show();
                Looper.loop();*/
            }
            Response response = chain.proceed(request);
            if (NetWorkUtils.isNetWorkAvailable(MyApp.getInstance())) {
                response = response.newBuilder()
                        .removeHeader("Pragma")
                        .header("Cache-Control", "public, max-age=" + maxAge)
                        .build();
            } else {
                response = response.newBuilder()
                        .removeHeader("Pragma")
                        .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                        .build();
            }
            return response;
        }
    }

    public interface OnGetServerDateLisnter {
        void getData(String string);
    }
}
数据解析类

/**
 * 1. 类的用途 如果要将得到的json直接转化为集合 建议使用该类
 * 该类的onUi() onFailed()方法运行在主线程
 * 2. @author forever
 * 3. @date 2017/9/24 18:47
 */

public abstract class GsonObjectCallback<T> implements Callback {
    private Handler handler = OkHttp3Utils.getInstance().getHandler();



    //主线程处理
    public abstract void onUi(T t);

    //主线程处理
    public abstract void onFailed(Call call, IOException e);

    //请求失败
    @Override
    public void onFailure(final Call call, final IOException e) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                onFailed(call, e);
            }
        });
    }

    //请求json 并直接返回泛型的对象 主线程处理
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        String json = response.body().string();
        Class<T> cls = null;

        Class clz = this.getClass();
        ParameterizedType type = (ParameterizedType) clz.getGenericSuperclass();
        Type[] types = type.getActualTypeArguments();
        cls = (Class<T>) types[0];
        Gson gson = new Gson();
        final T t = gson.fromJson(json, cls);
        handler.post(new Runnable() {
            @Override
            public void run() {
            onUi(t);
            }
        });
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值