购物车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); } }); } }