实现京东购物车

//首先你需要分包明确
//先创建一个adapter的包
//在adapter的包中创建一个类
//好了不绕圈子啦给你们把代码放上来吧
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;

import com.facebook.drawee.view.SimpleDraweeView;

import org.greenrobot.eventbus.EventBus;

import java.util.List;

import baway.com.gouwuche.R;
import baway.com.gouwuche.bean.EventBean;
import baway.com.gouwuche.bean.EventBusBool;
import baway.com.gouwuche.bean.ShopCarBean;
import baway.com.gouwuche.net.MyView;
import baway.com.gouwuche.presenter.MainPresenter;
import baway.com.gouwuche.view.IView.IMainActivity;

/**
 * Created by Administrator on 2017/12/19.
 */

public class MyExAdapter extends BaseExpandableListAdapter {
    Context context;
    List<ShopCarBean.DataBean> list;
    int isxian=View.INVISIBLE;
    MainPresenter presenter;
    public MyExAdapter(Context context, List<ShopCarBean.DataBean> list, IMainActivity iMainActivity) {
        this.context = context;
        this.list = list;
        presenter=new MainPresenter(iMainActivity);
    }

    @Override
    public int getGroupCount() {
        return list.size();
    }

    @Override
    public int getChildrenCount(int i) {
        return list.get(i).getList().size();
    }

    @Override
    public Object getGroup(int i) {
        return list.get(i);
    }

    @Override
    public Object getChild(int i, int i1) {
        return list.get(i).getList().get(i1);
    }

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

    @Override
    public long getChildId(int i, int i1) {
        return i1;
    }

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

    class MyGroupHolder {
        TextView name;
        CheckBox checkBox;
        TextView bianji;
    }

    @Override
    public View getGroupView(final int i, boolean b, View view, ViewGroup viewGroup) {
        MyGroupHolder holder;
        if (view == null) {
            //加载布局
            view = View.inflate(context, R.layout.item_group, null);
            holder = new MyGroupHolder();
            holder.name = view.findViewById(R.id.group_name);
            holder.checkBox = view.findViewById(R.id.group_check);
            holder.bianji=view.findViewById(R.id.bianji);
            view.setTag(holder);
        }
        {
            holder = (MyGroupHolder) view.getTag();
        }

        //父数据
        final ShopCarBean.DataBean dataBean = list.get(i);
        holder.name.setText(dataBean.getSellerName());
        holder.checkBox.setChecked(dataBean.isGroupCheck());
        final MyGroupHolder finalHolder = holder;
        holder.checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EventBusBool eventBusBool=new EventBusBool();
                if(finalHolder.checkBox.isChecked())
                {
                    dataBean.setGroupCheck(true);
                    isChild(i,true);
                    if(isGroupAll())
                    {
                       eventBusBool.setB(true);
                    }
                }
                else {
                    dataBean.setGroupCheck(false);
                    isChild(i,false);
                    eventBusBool.setB(false);
                }
                isAllPrice();
                EventBus.getDefault().post(eventBusBool);
                notifyDataSetChanged();//刷新适配器
            }
        });
        //编辑
        holder.bianji.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               if(isxian==View.INVISIBLE)
               {
                   isxian=View.VISIBLE;
               }
               else
               {
                   isxian=View.INVISIBLE;
               }
               notifyDataSetChanged();
            }
        });
        return view;
    }

   public class MyChildHolder {
        CheckBox checkBox;
        SimpleDraweeView simpleDraweeView;
        TextView name;
        TextView time;
        TextView price;
        MyView myView;
        TextView del;
    }

    @Override
    public View getChildView(final int i, final int i1, boolean b, View view, ViewGroup viewGroup) {
        MyChildHolder holder;
        if (view == null) {
            view = View.inflate(context, R.layout.item_child, null);
            holder = new MyChildHolder();
            holder.checkBox = view.findViewById(R.id.child_check);
            holder.name = view.findViewById(R.id.child_name);
            holder.price = view.findViewById(R.id.child_price);
            holder.time = view.findViewById(R.id.child_time);
            holder.simpleDraweeView = view.findViewById(R.id.simple);
            holder.del=view.findViewById(R.id.del);
            holder.myView=view.findViewById(R.id.myview);
            view.setTag(holder);
        }
        {
            holder = (MyChildHolder) view.getTag();
        }

        final ShopCarBean.DataBean.ListBean listBean = list.get(i).getList().get(i1);
        String str[] = listBean.getImages().split("\\|");
        holder.simpleDraweeView.setImageURI(str[0]);
        holder.time.setText(listBean.getCreatetime());
        holder.price.setText("¥" + listBean.getPrice());
        holder.name.setText(listBean.getSubhead().substring(0, 10));
        holder.checkBox.setChecked(listBean.isChildCheck());
        holder.del.setVisibility(isxian);
        holder.myView.setNum(listBean.getNum()+"");
        //点击事件
        final MyChildHolder finalHolder = holder;
        holder.checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EventBusBool eventBusBool=new EventBusBool();
                if(finalHolder.checkBox.isChecked())
                {

                    listBean.setChildCheck(true);
                    if(isChildGroup(i))//判断二级是否全选
                    {
                        list.get(i).setGroupCheck(true);

                        if(isGroupAll())
                        {
                            eventBusBool.setB(true);
                        }
                    }
                }
                else
                {
                    listBean.setChildCheck(false);
                    list.get(i).setGroupCheck(false);
                    eventBusBool.setB(false);
                }
                EventBus.getDefault().post(eventBusBool);
                isAllPrice();
                notifyDataSetChanged();//刷新适配器
            }
        });
        //删除
        holder.del.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
              /*  list.get(i).getList().remove(i1);*/
              presenter.postDelCar("1753",listBean.getPid()+"");
                //notifyDataSetChanged();
            }
        });

        holder.myView.setAdditemClick(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int num=listBean.getNum();
                num++;
                listBean.setNum(num);
                isAllPrice();
                finalHolder.myView.setNum(num+"");
            }
        });
        holder.myView.setJianitemClick(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int num=listBean.getNum();
                if(num==1)
                {
                    Toast.makeText(context,"最小为1",Toast.LENGTH_SHORT).show();
                    return;
                }
                num--;
                listBean.setNum(num);
                isAllPrice();
                finalHolder.myView.setNum(num+"");
            }
        });

        return view;
    }

    @Override
    public boolean isChildSelectable(int i, int i1) {
        return false;
    }
      //二级和一级联动
        public boolean isChildGroup(int position)
        {
            for(int i=0;i<list.get(position).getList().size();i++)
            {
                if(!list.get(position).getList().get(i).isChildCheck())
                {
                    return false;
                }
            }
            return true;
        }
     //二级和全选
    public boolean isGroupAll()
    {
       for(int i=0;i<list.size();i++)
       {
           if(!list.get(i).isGroupCheck())
           {
               return false;
           }
       }
       return true;
    }
    //一级与二级
    public void isChild(int position,boolean b)
    {
        List<ShopCarBean.DataBean.ListBean> listBeans=list.get(position).getList();
        for(int i=0;i<listBeans.size();i++)
        {
            listBeans.get(i).setChildCheck(b);
        }
    }
    //计算价格的方法
    public void isAllPrice()
    {
        int num = 0;
        int price = 0;
        for(int i=0;i<list.size();i++)
        {
            List<ShopCarBean.DataBean.ListBean> listBeans=list.get(i).getList();
            for(int j=0;j<listBeans.size();j++)
            {
               if(listBeans.get(j).isChildCheck())
               {
                   num+=listBeans.get(j).getNum();
                   price+=listBeans.get(j).getNum()*listBeans.get(j).getPrice();
               }
            }
        }
        EventBean eventBean=new EventBean();
        eventBean.setNum(num+"");
        eventBean.setPrice(price+"");
        EventBus.getDefault().post(eventBean);
    }

}
//然后创建一个bean的包
//在这个包里有4个具体的bean的类
//第一个类
public class EventBean {
    private  String price;
    private  String num;

    public String getPrice() {
        return price;
    }

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

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }
}
//好了然后来创建第二个bean类吧 
//接下来是第二个
public class EventBusBool {
    boolean b;

    public boolean isB() {
        return b;
    }

    public void setB(boolean b) {
        this.b = b;
    }
}
//第三个bean类
public class MsgBean {

    /**
     * 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;
    }
}
//别着急,接下来就是最后一个bean类啦
//第四个bean类
public class ShopCarBean {

    /**
     * msg : 请求成功
     * code : 0
     * data : [{"list":[{"bargainPrice":22.9,"createtime":"2017-10-14T21:48:08","detailUrl":"https://item.m.jd.com/product/2542855.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t1930/284/2865629620/390243/e3ade9c4/56f0a08fNbd3a1235.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2137/336/2802996626/155915/e5e90d7a/56f0a09cN33e01bd0.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t1882/31/2772215910/389956/c8dbf370/56f0a0a2Na0c86ea6.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2620/166/2703833710/312660/531aa913/57709035N33857877.jpg!q70.jpg","num":1,"pid":24,"price":288,"pscid":2,"selected":1,"sellerid":1,"subhead":"三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》","title":"三只松鼠 坚果炒货 零食奶油味 碧根果225g/袋"},{"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":1599,"createtime":"2017-10-14T21:48:08","detailUrl":"https://item.m.jd.com/product/1993026402.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t5863/302/8961270302/97126/41feade1/5981c81cNc1b1fbef.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7003/250/1488538438/195825/53bf31ba/5981c57eN51e95176.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5665/100/8954482513/43454/418611a9/5981c57eNd5fc97ba.jpg!q70.jpg","num":2,"pid":47,"price":111,"pscid":39,"selected":0,"sellerid":3,"subhead":"碳黑色 32GB 全网通 官方标配   1件","title":"锤子 坚果Pro 特别版 巧克力色 酒红色 全网通 移动联通电信4G手机 双卡双待 碳黑色 32GB 全网通"},{"bargainPrice":5599,"createtime":"2017-10-10T17:30:32","detailUrl":"https://item.m.jd.com/product/4824715.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n12/jfs/t7768/184/1153704394/148460/f42e1432/599a930fN8a85626b.jpg!q70.jpg","num":1,"pid":59,"price":5599,"pscid":40,"selected":0,"sellerid":3,"subhead":"游戏本选择4G独显,拒绝掉帧】升级版IPS全高清防眩光显示屏,WASD方向键颜色加持,三大出风口立体散热!","title":"戴尔DELL灵越游匣15PR-6648B GTX1050 15.6英寸游戏笔记本电脑(i5-7300HQ 8G 128GSSD+1T 4G独显 IPS)黑"}],"sellerName":"商家3","sellerid":"3"},{"list":[{"bargainPrice":3455,"createtime":"2017-10-14T21:38:26","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":1,"pid":48,"price":222,"pscid":39,"selected":0,"sellerid":4,"subhead":"【现货新品抢购】全面屏2.0震撼来袭,骁龙835处理器,四曲面陶瓷机","title":"小米(MI) 小米MIX2 手机 黑色 全网通 (6GB+64GB)【标配版】"},{"bargainPrice":11800,"createtime":"2017-10-14T21:48:08","detailUrl":"https://mitem.jd.hk/ware/view.action?wareId=1988853309&cachekey=1acb07a701ece8d2434a6ae7fa6870a1","images":"https://m.360buyimg.com/n0/jfs/t6130/97/1370670410/180682/1109582a/593276b1Nd81fe723.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5815/178/2614671118/51656/7f52d137/593276c7N107b725a.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5878/60/2557817477/30873/4502b606/593276caN5a7d6357.jpg!q70.jpg","num":1,"pid":60,"price":13888,"pscid":40,"selected":0,"sellerid":4,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)","title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"}],"sellerName":"商家4","sellerid":"4"},{"list":[{"bargainPrice":11800,"createtime":"2017-10-14T21:38:26","detailUrl":"https://mitem.jd.hk/ware/view.action?wareId=1988853309&cachekey=1acb07a701ece8d2434a6ae7fa6870a1","images":"https://m.360buyimg.com/n0/jfs/t6130/97/1370670410/180682/1109582a/593276b1Nd81fe723.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5815/178/2614671118/51656/7f52d137/593276c7N107b725a.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5878/60/2557817477/30873/4502b606/593276caN5a7d6357.jpg!q70.jpg","num":1,"pid":63,"price":10000,"pscid":40,"selected":0,"sellerid":7,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)","title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"}],"sellerName":"商家7","sellerid":"7"}]
     */

    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":22.9,"createtime":"2017-10-14T21:48:08","detailUrl":"https://item.m.jd.com/product/2542855.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t1930/284/2865629620/390243/e3ade9c4/56f0a08fNbd3a1235.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2137/336/2802996626/155915/e5e90d7a/56f0a09cN33e01bd0.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t1882/31/2772215910/389956/c8dbf370/56f0a0a2Na0c86ea6.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2620/166/2703833710/312660/531aa913/57709035N33857877.jpg!q70.jpg","num":1,"pid":24,"price":288,"pscid":2,"selected":1,"sellerid":1,"subhead":"三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》","title":"三只松鼠 坚果炒货 零食奶油味 碧根果225g/袋"},{"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 isGroupCheck;

        public boolean isGroupCheck() {
            return isGroupCheck;
        }

        public void setGroupCheck(boolean groupCheck) {
            isGroupCheck = groupCheck;
        }

        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 : 22.9
             * createtime : 2017-10-14T21:48:08
             * detailUrl : https://item.m.jd.com/product/2542855.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends
             * images : https://m.360buyimg.com/n0/jfs/t1930/284/2865629620/390243/e3ade9c4/56f0a08fNbd3a1235.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2137/336/2802996626/155915/e5e90d7a/56f0a09cN33e01bd0.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t1882/31/2772215910/389956/c8dbf370/56f0a0a2Na0c86ea6.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2620/166/2703833710/312660/531aa913/57709035N33857877.jpg!q70.jpg
             * num : 1
             * pid : 24
             * price : 288.0
             * pscid : 2
             * selected : 1
             * sellerid : 1
             * subhead : 三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》
             * title : 三只松鼠 坚果炒货 零食奶油味 碧根果225g/袋
             */

            private double bargainPrice;
            private String createtime;
            private String detailUrl;
            private String images;
            private int num;
            private int pid;
            private double price;
            private int pscid;
            private int selected;
            private int sellerid;
            private String subhead;
            private String title;
            private boolean isChildCheck;

            public boolean isChildCheck() {
                return isChildCheck;
            }

            public void setChildCheck(boolean childCheck) {
                isChildCheck = childCheck;
            }

            public double getBargainPrice() {
                return bargainPrice;
            }

            public void setBargainPrice(double 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 int getNum() {
                return num;
            }

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

            public int getPid() {
                return pid;
            }

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

            public double getPrice() {
                return price;
            }

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

            public int getPscid() {
                return pscid;
            }

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

            public int getSelected() {
                return selected;
            }

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

            public int getSellerid() {
                return sellerid;
            }

            public void setSellerid(int 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;
            }
        }
    }
}

//好了把这些bean类创建好了以后
//因为使用的是MVP框架所以现在就来写一下model的包吧
//在这个包里有一个类(类名MainModle),还有一个包里面放了一个接口这个包名是IModle
//先放一下包里接口的东西吧
import java.util.HashMap;

import baway.com.gouwuche.bean.MsgBean;
import baway.com.gouwuche.bean.ShopCarBean;
import baway.com.gouwuche.net.NetWorkListener;

/**
 * Created by Administrator on 2017/12/19.
 */

public interface IMainModle {

     //展示购物车数据
     public void postCar(String uid, NetWorkListener<ShopCarBean> netWorkListener);
     //删除购物车
     public void postDelCar(HashMap<String, String> hashMap, NetWorkListener<MsgBean> netWorkListener);
     //更新购物车
     public void postUpdaterCar(HashMap<String, String> hashMap, NetWorkListener<MsgBean> netWorkListener);
}
//再放一下model里的MainModle类吧
import java.util.HashMap;

import baway.com.gouwuche.bean.MsgBean;
import baway.com.gouwuche.bean.ShopCarBean;
import baway.com.gouwuche.model.IModle.IMainModle;
import baway.com.gouwuche.net.NetWorkListener;
import baway.com.gouwuche.utils.RetrofitHelper;
import baway.com.gouwuche.utils.ServerApi;
import rx.Observer;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

/**
 * Created by Administrator on 2017/12/19.
 */

public class MainModle implements IMainModle {

    //展示购物车数据
    @Override
    public void postCar(String uid, final NetWorkListener<ShopCarBean> netWorkListener) {

        ServerApi serverApi= RetrofitHelper.getServerApi();
        serverApi.shopCall(uid)
                 .subscribeOn(Schedulers.io())
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(new Observer<ShopCarBean>() {
                     @Override
                     public void onCompleted() {

                     }

                     @Override
                     public void onError(Throwable e) {
                         netWorkListener.onError((Exception) e);
                     }

                     @Override
                     public void onNext(ShopCarBean shopCarBean) {
                         netWorkListener.onSuccess(shopCarBean);
                     }
                 });
    }

    //删除购物车
    @Override
    public void postDelCar(HashMap<String, String> hashMap, final NetWorkListener<MsgBean> netWorkListener) {
        ServerApi serverApi=RetrofitHelper.getServerApi();
        serverApi.msgCall(hashMap)
                 .subscribeOn(Schedulers.io())
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(new Observer<MsgBean>() {
                     @Override
                     public void onCompleted() {

                     }

                     @Override
                     public void onError(Throwable e) {
                          netWorkListener.onError((Exception) e);
                     }

                     @Override
                     public void onNext(MsgBean msgBean) {
                       netWorkListener.onSuccess(msgBean);
                     }
                 });
    }

    //更新购物车数据
    @Override
    public void postUpdaterCar(HashMap<String, String> hashMap, final NetWorkListener<MsgBean> netWorkListener) {
             ServerApi serverApi=RetrofitHelper.getServerApi();
             serverApi.msgCall(hashMap)
                      .subscribeOn(Schedulers.io())
                      .observeOn(AndroidSchedulers.mainThread())
                      .subscribe(new Observer<MsgBean>() {
                          @Override
                          public void onCompleted() {

                          }

                          @Override
                          public void onError(Throwable e) {
                             netWorkListener.onError((Exception) e);
                          }

                          @Override
                          public void onNext(MsgBean msgBean) {
                            netWorkListener.onSuccess(msgBean);
                          }
                      });
    }
}

//好了我们的model就做这么多工作
//接下来来看一下我们的网络包net里面都做了什么吧
//创建一个net包
//首先里面创建了一个Api的接口来存放要请求的接口
public interface Api {

    public String HOST="http://120.27.23.105/";
    public String SHOPCAR="product/getCarts?source=android";//查询购物车
    public String DELETECAR="product/deleteCart";//删除购物车
    public String UPDATECAR="product/updateCarts";//更新购物车
}
//然后来创建一个App因为在做图片展示的时候要用到Fresco所以要创建一个App初始化一下Fresco
import android.app.Application;

import com.facebook.drawee.backends.pipeline.Fresco;

/**
 * Created by Administrator on 2017/12/19.
 */

public class App extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
    }
}
//完事,这个时候千万不要忘记去清单文件里注册一下App呦不然会报错滴
//在net包里还有什么东东嘞,来,再创建一个MyView类吧
//这个类里面放的是这些东西
import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import baway.com.gouwuche.R;


/**
 * Created by Administrator on 2017/12/19.
 */

public class MyView extends LinearLayout {

    ImageView jia;
    TextView num;
    ImageView jian;
    public MyView(Context context) {
        super(context);
    }

    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        View view=View.inflate(context, R.layout.item_view,this);
        jia=view.findViewById(R.id.jia);
        num=view.findViewById(R.id.num);
        jian=view.findViewById(R.id.jian);
    }

    public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**
     * ++
     * @param onClickListener
     */
    public void setAdditemClick(OnClickListener onClickListener)
    {
        jia.setOnClickListener(onClickListener);
    }
    /**
     * --
     */
    public void setJianitemClick(OnClickListener onClickListener)
    {
        jian.setOnClickListener(onClickListener);
    }
    //赋值
    public void setNum(String num1)
    {
        num.setText(num1+"");
    }
}
//不要说话趁热打铁的来再创建一个NetWorkListener接口
public interface NetWorkListener<T>{

      public void onError(Exception e);
      public void onSuccess(T t);
}
//以上就是net包的所有操作啦
//现在来看一看我们伟大的Presenter包做了什么工作
//千万不要忘记创建一个presenter包呦哈哈哈
import java.util.HashMap;

import baway.com.gouwuche.bean.MsgBean;
import baway.com.gouwuche.bean.ShopCarBean;
import baway.com.gouwuche.model.IModle.IMainModle;
import baway.com.gouwuche.model.MainModle;
import baway.com.gouwuche.net.NetWorkListener;
import baway.com.gouwuche.view.IView.IMainActivity;

/**
 * Created by Administrator on 2017/12/19.
 */

public class MainPresenter {

    IMainActivity iMainActivity;
    IMainModle iMainModle;

    public MainPresenter(IMainActivity iMainActivity) {
        this.iMainActivity = iMainActivity;
        iMainModle=new MainModle();
    }

    //购物车数据
    public void postShopCar()
    {
         iMainModle.postCar("1753", new NetWorkListener<ShopCarBean>() {
             @Override
             public void onError(Exception e) {

             }

             @Override
             public void onSuccess(ShopCarBean shopCarBean) {
                  iMainActivity.showShopCar(shopCarBean);
             }
         });
    }
    //删除购物车
    public void postDelCar(String uid,String pid)
    {
        HashMap<String,String> hashMap=new HashMap<>();
        hashMap.put("uid",uid);
        hashMap.put("pid",pid);
        iMainModle.postDelCar(hashMap, new NetWorkListener<MsgBean>() {
            @Override
            public void onError(Exception e) {

            }

            @Override
            public void onSuccess(MsgBean msgBean) {
              iMainActivity.showDelCar(msgBean);
            }
        });
    }

     //
    public void doDview()
    {
        iMainActivity=null;
    }
}
//我们伟大的Presenter就光荣的完成任务啦
//现在来看一下Utils包里放了什么
//首先我们先创建了一个RetrofitHelper类
import baway.com.gouwuche.net.Api;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * Created by Administrator on 2017/12/19.
 */

public class RetrofitHelper {

        public static OkHttpClient okHttpClient;
        public static ServerApi serverApi;

        static
        {
            initOkHttpClient();
        }

      private static void initOkHttpClient() {
            if(okHttpClient==null)
            {
                synchronized (RetrofitHelper.class)
                {
                    if(okHttpClient==null)
                    {
                        okHttpClient=new OkHttpClient();
                    }
                }
            }
       }

       //获取SverApi对象
      public static  ServerApi getServerApi()
      {
          if(serverApi==null)
          {
              synchronized (ServerApi.class)
              {
                  if(serverApi==null)
                  {
                      serverApi=onCreatApi(ServerApi.class, Api.HOST);
                  }
              }
          }
          return serverApi;
      }

       //初始化ServerApi
       public  static<T> T onCreatApi(Class<T> tClass,String url)
       {
           Retrofit retrofit=new Retrofit.Builder()
                                  .baseUrl(url)
                                   .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                                  .addConverterFactory(GsonConverterFactory.create())
                                  .build();
           return retrofit.create(tClass);
       }

      /* private<T> void toComurer(Observable<T> observable, Consumer<T> t,Consumer<Throwable> e)
       {
             observable.subscribeOn(Schedulers.io())
                        .unsubscribeOn(Schedulers.io())
                       .observeOn(AndroidSchedulers.mainThread())
                       .subscribe(t,e);

       }*/
}
//来,再来创建一个接口ServerApi
import java.util.HashMap;

import baway.com.gouwuche.bean.MsgBean;
import baway.com.gouwuche.bean.ShopCarBean;
import baway.com.gouwuche.net.Api;
import retrofit2.http.POST;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import rx.Observable;

/**
 * Created by Administrator on 2017/12/19.
 */

public interface ServerApi {

    //查询购物车
     @POST(Api.SHOPCAR)
     Observable<ShopCarBean> shopCall(@Query("uid") String uid);
     //删除购物车
     @POST(Api.DELETECAR)
     Observable<MsgBean> msgCall(@QueryMap HashMap<String, String> hashMap);
     //更新购物车
     Observable<MsgBean> UpdaterCall(@QueryMap HashMap<String, String> hashMap);

}
//终于到view包了
//view包里做了啥捏
//view里面有一个包IView在这个包里面有一个接口IMainActivity
import baway.com.gouwuche.bean.MsgBean;
import baway.com.gouwuche.bean.ShopCarBean;

/**
 * Created by Administrator on 2017/12/19.
 */

public interface IMainActivity {

      //展示购物车数据
      public void showShopCar(ShopCarBean shopCarBean);
      //删除购物车数据
      public void showDelCar(MsgBean msgBean);
}
//view里面还有一个MainActivity这个我也放到view包啦
//代码奉上
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.Toast;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;

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

import baway.com.gouwuche.R;
import baway.com.gouwuche.adapter.MyExAdapter;
import baway.com.gouwuche.bean.EventBean;
import baway.com.gouwuche.bean.EventBusBool;
import baway.com.gouwuche.bean.MsgBean;
import baway.com.gouwuche.bean.ShopCarBean;
import baway.com.gouwuche.presenter.MainPresenter;
import baway.com.gouwuche.view.IView.IMainActivity;

public class MainActivity extends AppCompatActivity implements IMainActivity {

    List<ShopCarBean.DataBean> groupList;
    private ExpandableListView mMexl;
    MyExAdapter adapter;
    MainPresenter presenter;
    private CheckBox mCheck;
    /**
     * 价格:0
     */
    private TextView mAllprice;
    /**
     * 结算
     */
    private TextView mJiesuan;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);
        initView();
        presenter = new MainPresenter(this);
        presenter.postShopCar();
    }

    //购物车数据
    @Override
    public void showShopCar(ShopCarBean shopCarBean) {
        groupList = new ArrayList<>();
        groupList = shopCarBean.getData();
        adapter = new MyExAdapter(MainActivity.this, groupList,this);
        mMexl.setAdapter(adapter);
        //默认展开
        mMexl.setGroupIndicator(null);
        for (int i = 0; i < groupList.size(); i++) {
            mMexl.expandGroup(i);
        }

        mCheck.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(mCheck.isChecked())
                {
                    isAllPrice(true);
                }
                else
                {
                 isAllPrice(false);
                }
                adapter.notifyDataSetChanged();
            }
        });
    }

    //删除购物车
    @Override
    public void showDelCar(MsgBean msgBean) {
        Toast.makeText(MainActivity.this,msgBean.getMsg(),Toast.LENGTH_SHORT).show();
        presenter.postShopCar();

    }

    private void initView() {
        mMexl = (ExpandableListView) findViewById(R.id.mexl);

        mCheck = (CheckBox) findViewById(R.id.check);
        mAllprice = (TextView) findViewById(R.id.allprice);
        mJiesuan = (TextView) findViewById(R.id.jiesuan);
    }

    @Subscribe
    public void getCheck(EventBusBool eventBusBool) {
             mCheck.setChecked(eventBusBool.isB());
    }
    @Subscribe
    public void getBean(EventBean eventBusBool) {
        mJiesuan.setText("结算:("+eventBusBool.getNum()+")");
        mAllprice.setText("¥"+eventBusBool.getPrice());
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
        presenter.doDview();//解绑
    }
    //计算价格的方法
    public void isAllPrice(boolean b)
    {
        for(int i=0;i<groupList.size();i++)
        {
            groupList.get(i).setGroupCheck(b);
            List<ShopCarBean.DataBean.ListBean> listBeans=groupList.get(i).getList();
            for(int j=0;j<listBeans.size();j++)
            {
                listBeans.get(j).setChildCheck(b);
            }
        }
       adapter.isAllPrice();//计算价格和数量
    }
}

//下面是布局文件啦
//activity_main的布局
<LinearLayout 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"
    android:orientation="vertical"
   >
<ExpandableListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:id="@+id/mexl"></ExpandableListView>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:layout_weight="9">
        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center_vertical"
            android:id="@+id/check"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="全选"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:layout_marginLeft="150dp"
            android:text="价格:0"
            android:id="@+id/allprice"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:background="@android:color/holo_orange_dark"
            android:text="结算"
            android:id="@+id/jiesuan"/>
    </LinearLayout>
</LinearLayout>

//item_child的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal">
    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:focusable="true"
        android:gravity="center_vertical"
        android:id="@+id/child_check"/>
<com.facebook.drawee.view.SimpleDraweeView
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:id="@+id/simple"
    app:placeholderImage="@mipmap/ic_launcher"/>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/child_name"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/child_time"/>
       <LinearLayout
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:orientation="horizontal">
           <TextView
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:textColor="@android:color/holo_red_dark"
               android:id="@+id/child_price"/>
           <baway.com.gouwuche.net.MyView
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:id="@+id/myview"></baway.com.gouwuche.net.MyView>
       </LinearLayout>
    </LinearLayout>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="end"
        android:textColor="@android:color/holo_red_dark"
        android:text="删除"
        android:visibility="invisible"
        android:id="@+id/del"/>
</LinearLayout>

//item_group的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/group_check"/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/group_name"
    />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="编辑"
        android:id="@+id/bianji"
        android:textStyle="bold"
        android:textSize="16sp"
        android:gravity="end"/>
</LinearLayout>


//item_view的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
 <ImageView
     android:layout_width="30dp"
     android:layout_height="30dp"
     android:id="@+id/jia"
     android:src="@drawable/shopcart_add_red"/>
    <TextView
        android:layout_width="50dp"
        android:layout_height="match_parent"
        android:gravity="center"
        android:id="@+id/num"
        android:background="@drawable/shopcar_item"/>
    <ImageView
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:id="@+id/jian"
        android:src="@drawable/shopcart_minus_red"/>
</LinearLayout>
//还有drawable里面的资源也都给你们放出来啦
//有一个这个shopcar_item.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners
    android:radius="200dp">
</corners>
    <stroke android:color="@color/colorPrimaryDark" android:width="1dp"/>
</shape>
//这个里面还有三张图片资源你们可以自己从网上找一下子就可以啦,这三张是+-号的图片

//app里面的依赖
compile 'org.greenrobot:eventbus:3.0.0'
compile 'com.facebook.fresco:fresco:1.5.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.trello:rxlifecycle:1.0'
compile 'com.trello:rxlifecycle-components:1.0'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'org.greenrobot:eventbus:3.1.1'
compile 'com.jakewharton:butterknife:8.1.0'

通用接口实现类LinkJOS 扩展于:public class LinkJOS extends LinkOAuth2(LinkOAuth2 extends JspEasy) 构造函数 LinkJOS(HttpServletRequest request,HttpServletResponse response) 京东JOS接口访问函数 public String link2(String link,String method,Bag sys,Bag apps,String appSecret,String file,String FileField) 作用:访问京东JOS平台的所有接口 参数: String link,京东JOS平台接口访问地址,目前固定为:https://api.jd.com/routerjson String method,向京东JOS平台提交数据时的方法,需要应用级别参数时建议用POST方法,不需要时用GET(参见后边的实例) Bag sys,系统级别参数书包(一般只需在接口参数文件中放入接口方法即可,参见后边的实例) Bag apps,应用级别参数书包(在接口参数文件中放入必须的应用级别参数,若不需要应用级别参数时直接用new Bag(-1)构造一个空书包即可,参见后边的实例) String appSecret,应用证书中的App Secret,前边已经设置,固定用"@{pPage:app_secret}"即可 String file,调用上传文件接口上传文件(如图片)到京东JOS平台时的文件全名(含相对路径,如:images/logo.png),不是调用上传文件接口时为空字符串即可(参见后边的实例) String FileField,调用上传文件接口上传文件(如图片)到京东JOS平台时的字段名,配合前边的参数,不是调用上传文件接口时为空字符串即可(参见后边的实例) 返回为京东JOS平台接口对应的JSON格式的字符串 JSON文本解析方法 public void parseJson(String json) 作用:解析京东JOS平台接口返回的JSON格式的字符串,并根据内容生成N个对应的书包 参数:String json,京东JOS平台接口返回的JSON格式的字符串 根据JSON文本的内容在系统中生成N个书包,根书包名称为j0,下一层的josn文本内容生成的书包名称用上一层的Key放在上一层的书名中,下边用实例说明寻找对应书包的方法: 如店铺信息查询接口jingdong.vender.shop.query返回的json文本为 { "jingdong_vender_shop_query_responce": { "shop_jos_result": { "open_time": "", "shop_id": "", "category_main_name": "", "category_main": "", "vender_id": "", "brief": "", "logo_url": "", "shop_name": "" } } } 找出店铺信息书包名的方法如下 @{j0:jingdong_vender_shop_query_responce} @{@{pPage:bag}:shop_jos_result} 这时候的@{pPage:bag}即为需要的店铺信息书包名 具体用法请阅读下载包中的《京东卖家如何快速开发网店工具软件》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值