RxJava+Retrofit+Mvp实现购物车

RxJava+Retrofit+Mvp实现购物车

先效果

框架结构:

1.项目框架:MVP(评分重点),图片加载用Fresco,网络请求用OKhttp+Retrofit实现(自己封装,加单例模式,(评分重点)),

2.完成购物车数据添加(如果接口无数据,可用接口工具添加数据),

3.自定义view实现加减按钮,每次点击加减,item中的总数及总价要做出相应的改变。

4.当数量为1时,点击减号,数量不变,吐司提示用户最小数量为1。

5.底部总数及总价为所有item项中的总价及总数,每个item中数量价格的更改,底部总价总数要与之联动

6.实现单选反选全选功能,首次进入默认全选,item未选中时总数及总价不计入底部数据,改变选中状态时,底部总数及总价能做出正确修改

7.点击删除按钮,删除item,底部总数及总价能做出正确修改,接口数据删除。

先上依赖:

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'//Retrofit2所需要的包
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'//ConverterFactory的Gson依赖包
compile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4'//ConverterFactory的String依赖包
compile 'io.reactivex.rxjava2:rxjava:2.1.3'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'de.greenrobot:eventbus:3.0.0-beta1'
compile 'com.facebook.fresco:fresco:0.11.0'
一、net包

1.1 API

[java]  view plain  copy
  1. <span style="font-size:14px;">public class API  {  
  2.     public static String HOST="http://120.27.23.105/product/";  
  3.   
  4. }</span>  
1.2 成功的接口

[java]  view plain  copy
  1. public interface CGSB<T> {  
  2.         void chengGong(T t);  
  3. }  
1.3 ServiceAPI
[java]  view plain  copy
  1. import com.bwie.changwanlei.myapplication.bean.CartBean;  
  2. import com.bwie.changwanlei.myapplication.bean.Tianjia;  
  3. import com.bwie.changwanlei.myapplication.bean.XQBean;  
  4. import io.reactivex.Flowable;  
  5. import retrofit2.http.GET;  
  6. import retrofit2.http.Query;  
  7.   
  8. public interface ServiceAPI {  
  9.     @GET("getProductDetail")  
  10.     Flowable<XQBean> getXQ(@Query("pid")int pid, @Query("source")String str);  
  11.     @GET("addCart")  
  12.     Flowable<Tianjia> getMsg(@Query("uid")int uid, @Query("pid")int pid, @Query("source")String str);  
  13.     @GET("getCarts")  
  14.     Flowable<CartBean> getCart(@Query("uid")int uid, @Query("source")String str);  
  15. }  

1.4  Retrofit的封装

[java]  view plain  copy
  1. import okhttp3.OkHttpClient;  
  2. import retrofit2.Retrofit;  
  3. import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;  
  4. import retrofit2.converter.gson.GsonConverterFactory;  
  5. public class RetrofitHepler {  
  6.     public static OkHttpClient okHttpClient;  
  7.     public static ServiceAPI serViceAPI;  
  8.     /** 
  9.      * 优先执行 
  10.      */  
  11.     static {  
  12.         getOkHttpClient();  
  13.     }  
  14.     public static OkHttpClient getOkHttpClient(){  
  15.         if(okHttpClient==null){  
  16.             synchronized (OkHttpClient.class){  
  17.                 if(okHttpClient==null){  
  18.                     okHttpClient=new OkHttpClient();  
  19.                 }  
  20.             }  
  21.         }  
  22.         return okHttpClient;  
  23.     }  
  24.     public static ServiceAPI getSerViceAPI(){  
  25.   
  26.         if(serViceAPI==null){  
  27.             synchronized (OkHttpClient.class){  
  28.                 if(serViceAPI==null){  
  29.                     serViceAPI=onCreate(ServiceAPI.class,API.HOST);  
  30.                 }  
  31.             }  
  32.         }  
  33.         return serViceAPI;  
  34.     }  
  35.     public static <T> T onCreate(Class<T>tClass,String url){  
  36.         Retrofit retrofit = new Retrofit.Builder()  
  37.                 .baseUrl(url)  
  38.                 .addConverterFactory(GsonConverterFactory.create())  
  39.                 .client(okHttpClient)  
  40.                 .addCallAdapterFactory(RxJava2CallAdapterFactory.create())  
  41.                 //.addCallAdapterFactory(RxJava2CallAdapterFactory.create())  
  42.                 .build();  
  43.         return retrofit.create(tClass);  
  44.     }  
  45. }  

二、bean类

1.1 详情页的Bean类


[java]  view plain  copy
  1. /** 
  2.  * Created by Administrator on 2017/12/19. 
  3.  */  
  4.   
  5. public class XQBean {  
  6.     /** 
  7.      * msg : 
  8.      * seller : {"description":"我是商家2","icon":"http://120.27.23.105/images/icon.png","name":"商家2","productNums":999,"score":5,"sellerid":2} 
  9.      * code : 0 
  10.      * data : {"bargainPrice":111.99,"createtime":"2017-10-14T21:48:08","detailUrl":"https://item.m.jd.com/product/4719303.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t9004/210/1160833155/647627/ad6be059/59b4f4e1N9a2b1532.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7504/338/63721388/491286/f5957f53/598e95f1N7f2adb87.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7441/10/64242474/419246/adb30a7d/598e95fbNd989ba0a.jpg!q70.jpg","itemtype":2,"pid":9,"price":78.99,"pscid":1,"salenum":2356,"sellerid":2,"subhead":"每个中秋都不能简单,无论身在何处,你总需要一块饼让生活更圆满,京东月饼让爱更圆满京东自营,闪电配送,更多惊喜,快用手指戳一下","title":"北京稻香村 稻香村中秋节月饼 老北京月饼礼盒655g"} 
  11.      */  
  12.   
  13.     private String msg;  
  14.     private SellerBean seller;  
  15.     private String code;  
  16.     private DataBean data;  
  17.   
  18.     public String getMsg() {  
  19.         return msg;  
  20.     }  
  21.   
  22.     public void setMsg(String msg) {  
  23.         this.msg = msg;  
  24.     }  
  25.   
  26.     public SellerBean getSeller() {  
  27.         return seller;  
  28.     }  
  29.   
  30.     public void setSeller(SellerBean seller) {  
  31.         this.seller = seller;  
  32.     }  
  33.   
  34.     public String getCode() {  
  35.         return code;  
  36.     }  
  37.   
  38.     public void setCode(String code) {  
  39.         this.code = code;  
  40.     }  
  41.   
  42.     public DataBean getData() {  
  43.         return data;  
  44.     }  
  45.   
  46.     public void setData(DataBean data) {  
  47.         this.data = data;  
  48.     }  
  49.   
  50.     public static class SellerBean {  
  51.         /** 
  52.          * description : 我是商家2 
  53.          * icon : http://120.27.23.105/images/icon.png 
  54.          * name : 商家2 
  55.          * productNums : 999 
  56.          * score : 5.0 
  57.          * sellerid : 2 
  58.          */  
  59.   
  60.         private String description;  
  61.         private String icon;  
  62.         private String name;  
  63.         private int productNums;  
  64.         private double score;  
  65.         private int sellerid;  
  66.   
  67.         public String getDescription() {  
  68.             return description;  
  69.         }  
  70.   
  71.         public void setDescription(String description) {  
  72.             this.description = description;  
  73.         }  
  74.   
  75.         public String getIcon() {  
  76.             return icon;  
  77.         }  
  78.   
  79.         public void setIcon(String icon) {  
  80.             this.icon = icon;  
  81.         }  
  82.   
  83.         public String getName() {  
  84.             return name;  
  85.         }  
  86.   
  87.         public void setName(String name) {  
  88.             this.name = name;  
  89.         }  
  90.   
  91.         public int getProductNums() {  
  92.             return productNums;  
  93.         }  
  94.   
  95.         public void setProductNums(int productNums) {  
  96.             this.productNums = productNums;  
  97.         }  
  98.   
  99.         public double getScore() {  
  100.             return score;  
  101.         }  
  102.   
  103.         public void setScore(double score) {  
  104.             this.score = score;  
  105.         }  
  106.   
  107.         public int getSellerid() {  
  108.             return sellerid;  
  109.         }  
  110.   
  111.         public void setSellerid(int sellerid) {  
  112.             this.sellerid = sellerid;  
  113.         }  
  114.     }  
  115.   
  116.     public static class DataBean {  
  117.         /** 
  118.          * bargainPrice : 111.99 
  119.          * createtime : 2017-10-14T21:48:08 
  120.          * detailUrl : https://item.m.jd.com/product/4719303.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends 
  121.          * images : https://m.360buyimg.com/n0/jfs/t9004/210/1160833155/647627/ad6be059/59b4f4e1N9a2b1532.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7504/338/63721388/491286/f5957f53/598e95f1N7f2adb87.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7441/10/64242474/419246/adb30a7d/598e95fbNd989ba0a.jpg!q70.jpg 
  122.          * itemtype : 2 
  123.          * pid : 9 
  124.          * price : 78.99 
  125.          * pscid : 1 
  126.          * salenum : 2356 
  127.          * sellerid : 2 
  128.          * subhead : 每个中秋都不能简单,无论身在何处,你总需要一块饼让生活更圆满,京东月饼让爱更圆满京东自营,闪电配送,更多惊喜,快用手指戳一下 
  129.          * title : 北京稻香村 稻香村中秋节月饼 老北京月饼礼盒655g 
  130.          */  
  131.   
  132.         private double bargainPrice;  
  133.         private String createtime;  
  134.         private String detailUrl;  
  135.         private String images;  
  136.         private int itemtype;  
  137.         private int pid;  
  138.         private double price;  
  139.         private int pscid;  
  140.         private int salenum;  
  141.         private int sellerid;  
  142.         private String subhead;  
  143.         private String title;  
  144.   
  145.         public double getBargainPrice() {  
  146.             return bargainPrice;  
  147.         }  
  148.   
  149.         public void setBargainPrice(double bargainPrice) {  
  150.             this.bargainPrice = bargainPrice;  
  151.         }  
  152.   
  153.         public String getCreatetime() {  
  154.             return createtime;  
  155.         }  
  156.   
  157.         public void setCreatetime(String createtime) {  
  158.             this.createtime = createtime;  
  159.         }  
  160.   
  161.         public String getDetailUrl() {  
  162.             return detailUrl;  
  163.         }  
  164.   
  165.         public void setDetailUrl(String detailUrl) {  
  166.             this.detailUrl = detailUrl;  
  167.         }  
  168.   
  169.         public String getImages() {  
  170.             return images;  
  171.         }  
  172.   
  173.         public void setImages(String images) {  
  174.             this.images = images;  
  175.         }  
  176.   
  177.         public int getItemtype() {  
  178.             return itemtype;  
  179.         }  
  180.   
  181.         public void setItemtype(int itemtype) {  
  182.             this.itemtype = itemtype;  
  183.         }  
  184.   
  185.         public int getPid() {  
  186.             return pid;  
  187.         }  
  188.   
  189.         public void setPid(int pid) {  
  190.             this.pid = pid;  
  191.         }  
  192.   
  193.         public double getPrice() {  
  194.             return price;  
  195.         }  
  196.   
  197.         public void setPrice(double price) {  
  198.             this.price = price;  
  199.         }  
  200.   
  201.         public int getPscid() {  
  202.             return pscid;  
  203.         }  
  204.   
  205.         public void setPscid(int pscid) {  
  206.             this.pscid = pscid;  
  207.         }  
  208.   
  209.         public int getSalenum() {  
  210.             return salenum;  
  211.         }  
  212.   
  213.         public void setSalenum(int salenum) {  
  214.             this.salenum = salenum;  
  215.         }  
  216.   
  217.         public int getSellerid() {  
  218.             return sellerid;  
  219.         }  
  220.   
  221.         public void setSellerid(int sellerid) {  
  222.             this.sellerid = sellerid;  
  223.         }  
  224.   
  225.         public String getSubhead() {  
  226.             return subhead;  
  227.         }  
  228.   
  229.         public void setSubhead(String subhead) {  
  230.             this.subhead = subhead;  
  231.         }  
  232.   
  233.         public String getTitle() {  
  234.             return title;  
  235.         }  
  236.   
  237.         public void setTitle(String title) {  
  238.             this.title = title;  
  239.         }  
  240.     }  
  241. }  

1.2  加入购物车的Bean

[java]  view plain  copy
  1. public class Tianjia {  
  2.     /** 
  3.      * msg : 加购成功 
  4.      * code : 0 
  5.      */  
  6.   
  7.     private String msg;  
  8.     private String code;  
  9.   
  10.     public String getMsg() {  
  11.         return msg;  
  12.     }  
  13.   
  14.     public void setMsg(String msg) {  
  15.         this.msg = msg;  
  16.     }  
  17.   
  18.     public String getCode() {  
  19.         return code;  
  20.     }  
  21.   
  22.     public void setCode(String code) {  
  23.         this.code = code;  
  24.     }  
  25. }  
1.3  商品类

[java]  view plain  copy
  1. import java.util.List;  
  2.   
  3. /** 
  4.  * Created by Administrator on 2017/12/19. 
  5.  */  
  6.   
  7. public class CartBean {  
  8.     /** 
  9.      * msg : 请求成功 
  10.      * code : 0 
  11.      * 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":0,"sellerid":1,"subhead":"三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》","title":"三只松鼠 坚果炒货 零食奶油味 碧根果225g/袋"},{"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":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":1,"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":111.99,"createtime":"2017-10-03T23:43:53","detailUrl":"https://item.m.jd.com/product/4719303.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t9004/210/1160833155/647627/ad6be059/59b4f4e1N9a2b1532.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7504/338/63721388/491286/f5957f53/598e95f1N7f2adb87.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7441/10/64242474/419246/adb30a7d/598e95fbNd989ba0a.jpg!q70.jpg","num":5,"pid":12,"price":256,"pscid":1,"selected":0,"sellerid":5,"subhead":"每个中秋都不能简单,无论身在何处,你总需要一块饼让生活更圆满,京东月饼让爱更圆满京东自营,闪电配送,更多惊喜,快用手指戳一下","title":"北京稻香村 稻香村中秋节月饼 老北京月饼礼盒655g"}],"sellerName":"商家5","sellerid":"5"},{"list":[{"bargainPrice":11800,"createtime":"2017-10-03T23:53:28","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":62,"price":15999,"pscid":40,"selected":0,"sellerid":6,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)","title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"}],"sellerName":"商家6","sellerid":"6"},{"list":[{"bargainPrice":399,"createtime":"2017-10-03T23:53:28","detailUrl":"https://item.m.jd.com/product/1439822107.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t5887/201/859509257/69994/6bde9bf6/59224c24Ne854e14c.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5641/233/853609022/57374/5c73d281/59224c24N3324d5f4.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5641/233/853609022/57374/5c73d281/59224c24N3324d5f4.jpg!q70.jpg","num":1,"pid":86,"price":777,"pscid":85,"selected":0,"sellerid":7,"subhead":"满2件,总价打6.50折","title":"Gap男装 休闲舒适简约水洗五袋直筒长裤紧身牛仔裤941825 深灰色 33/32(175/84A)"}],"sellerName":"商家7","sellerid":"7"},{"list":[{"bargainPrice":111.99,"createtime":"2017-10-14T21:39:05","detailUrl":"https://item.m.jd.com/product/4719303.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t9004/210/1160833155/647627/ad6be059/59b4f4e1N9a2b1532.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7504/338/63721388/491286/f5957f53/598e95f1N7f2adb87.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7441/10/64242474/419246/adb30a7d/598e95fbNd989ba0a.jpg!q70.jpg","num":12,"pid":1,"price":118,"pscid":1,"selected":0,"sellerid":17,"subhead":"每个中秋都不能简单,无论身在何处,你总需要一块饼让生活更圆满,京东月饼让爱更圆满京东自营,闪电配送,更多惊喜,快用手指戳一下","title":"北京稻香村 稻香村中秋节月饼 老北京月饼礼盒655g"}],"sellerName":"商家17","sellerid":"17"},{"list":[{"bargainPrice":111.99,"createtime":"2017-10-14T21:39:05","detailUrl":"https://item.m.jd.com/product/4719303.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t9004/210/1160833155/647627/ad6be059/59b4f4e1N9a2b1532.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7504/338/63721388/491286/f5957f53/598e95f1N7f2adb87.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7441/10/64242474/419246/adb30a7d/598e95fbNd989ba0a.jpg!q70.jpg","num":4,"pid":2,"price":299,"pscid":1,"selected":0,"sellerid":18,"subhead":"每个中秋都不能简单,无论身在何处,你总需要一块饼让生活更圆满,京东月饼让爱更圆满京东自营,闪电配送,更多惊喜,快用手指戳一下","title":"北京稻香村 稻香村中秋节月饼 老北京月饼礼盒655g"}],"sellerName":"商家18","sellerid":"18"},{"list":[{"bargainPrice":11800,"createtime":"2017-10-03T23:53:28","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":76,"price":37999.99,"pscid":40,"selected":0,"sellerid":20,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)","title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"}],"sellerName":"商家20","sellerid":"20"},{"list":[{"bargainPrice":111.99,"createtime":"2017-10-14T21:39:05","detailUrl":"https://item.m.jd.com/product/4719303.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t9004/210/1160833155/647627/ad6be059/59b4f4e1N9a2b1532.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7504/338/63721388/491286/f5957f53/598e95f1N7f2adb87.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7441/10/64242474/419246/adb30a7d/598e95fbNd989ba0a.jpg!q70.jpg","num":1,"pid":5,"price":88.99,"pscid":1,"selected":0,"sellerid":21,"subhead":"每个中秋都不能简单,无论身在何处,你总需要一块饼让生活更圆满,京东月饼让爱更圆满京东自营,闪电配送,更多惊喜,快用手指戳一下","title":"北京稻香村 稻香村中秋节月饼 老北京月饼礼盒655g"}],"sellerName":"商家21","sellerid":"21"}] 
  12.      */  
  13.   
  14.     private String msg;  
  15.     private String code;  
  16.     private List<DataBean> data;  
  17.   
  18.     public String getMsg() {  
  19.         return msg;  
  20.     }  
  21.   
  22.     public void setMsg(String msg) {  
  23.         this.msg = msg;  
  24.     }  
  25.   
  26.     public String getCode() {  
  27.         return code;  
  28.     }  
  29.   
  30.     public void setCode(String code) {  
  31.         this.code = code;  
  32.     }  
  33.   
  34.     public List<DataBean> getData() {  
  35.         return data;  
  36.     }  
  37.   
  38.     public void setData(List<DataBean> data) {  
  39.         this.data = data;  
  40.     }  
  41.   
  42.     public static class DataBean {  
  43.         /** 
  44.          * 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":0,"sellerid":1,"subhead":"三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》","title":"三只松鼠 坚果炒货 零食奶油味 碧根果225g/袋"},{"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手机"}] 
  45.          * sellerName : 商家1 
  46.          * sellerid : 1 
  47.          */  
  48.   
  49.         private String sellerName;  
  50.         private String sellerid;  
  51.         private List<ListBean> list;  
  52.   
  53.         private boolean check;  
  54.   
  55.         public boolean isCheck() {  
  56.             return check;  
  57.         }  
  58.   
  59.         public void setCheck(boolean check) {  
  60.             this.check = check;  
  61.         }  
  62.         public String getSellerName() {  
  63.             return sellerName;  
  64.         }  
  65.   
  66.         public void setSellerName(String sellerName) {  
  67.             this.sellerName = sellerName;  
  68.         }  
  69.   
  70.         public String getSellerid() {  
  71.             return sellerid;  
  72.         }  
  73.   
  74.         public void setSellerid(String sellerid) {  
  75.             this.sellerid = sellerid;  
  76.         }  
  77.   
  78.         public List<ListBean> getList() {  
  79.             return list;  
  80.         }  
  81.   
  82.         public void setList(List<ListBean> list) {  
  83.             this.list = list;  
  84.         }  
  85.   
  86.         public static class ListBean {  
  87.             /** 
  88.              * bargainPrice : 22.9 
  89.              * createtime : 2017-10-14T21:48:08 
  90.              * detailUrl : https://item.m.jd.com/product/2542855.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends 
  91.              * 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 
  92.              * num : 1 
  93.              * pid : 24 
  94.              * price : 288.0 
  95.              * pscid : 2 
  96.              * selected : 0 
  97.              * sellerid : 1 
  98.              * subhead : 三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》 
  99.              * title : 三只松鼠 坚果炒货 零食奶油味 碧根果225g/袋 
  100.              */  
  101.   
  102.             private double bargainPrice;  
  103.             private String createtime;  
  104.             private String detailUrl;  
  105.             private String images;  
  106.             private int num;  
  107.             private int pid;  
  108.             private double price;  
  109.             private int pscid;  
  110.             private int selected;  
  111.             private int sellerid;  
  112.             private String subhead;  
  113.             private String title;  
  114.             private int cou;  
  115.   
  116.             public int getCou() {  
  117.                 return cou;  
  118.             }  
  119.   
  120.             public void setCou(int cou) {  
  121.                 this.cou = cou;  
  122.             }  
  123.   
  124.             private boolean check;  
  125.   
  126.             public boolean isCheck() {  
  127.                 return check;  
  128.             }  
  129.   
  130.             public void setCheck(boolean check) {  
  131.                 this.check = check;  
  132.             }  
  133.   
  134.             public double getBargainPrice() {  
  135.                 return bargainPrice;  
  136.             }  
  137.   
  138.             public void setBargainPrice(double bargainPrice) {  
  139.                 this.bargainPrice = bargainPrice;  
  140.             }  
  141.   
  142.             public String getCreatetime() {  
  143.                 return createtime;  
  144.             }  
  145.   
  146.             public void setCreatetime(String createtime) {  
  147.                 this.createtime = createtime;  
  148.             }  
  149.   
  150.             public String getDetailUrl() {  
  151.                 return detailUrl;  
  152.             }  
  153.   
  154.             public void setDetailUrl(String detailUrl) {  
  155.                 this.detailUrl = detailUrl;  
  156.             }  
  157.   
  158.             public String getImages() {  
  159.                 return images;  
  160.             }  
  161.   
  162.             public void setImages(String images) {  
  163.                 this.images = images;  
  164.             }  
  165.   
  166.             public int getNum() {  
  167.                 return num;  
  168.             }  
  169.   
  170.             public void setNum(int num) {  
  171.                 this.num = num;  
  172.             }  
  173.   
  174.             public int getPid() {  
  175.                 return pid;  
  176.             }  
  177.   
  178.             public void setPid(int pid) {  
  179.                 this.pid = pid;  
  180.             }  
  181.   
  182.             public double getPrice() {  
  183.                 return price;  
  184.             }  
  185.   
  186.             public void setPrice(double price) {  
  187.                 this.price = price;  
  188.             }  
  189.   
  190.             public int getPscid() {  
  191.                 return pscid;  
  192.             }  
  193.   
  194.             public void setPscid(int pscid) {  
  195.                 this.pscid = pscid;  
  196.             }  
  197.   
  198.             public int getSelected() {  
  199.                 return selected;  
  200.             }  
  201.   
  202.             public void setSelected(int selected) {  
  203.                 this.selected = selected;  
  204.             }  
  205.   
  206.             public int getSellerid() {  
  207.                 return sellerid;  
  208.             }  
  209.   
  210.             public void setSellerid(int sellerid) {  
  211.                 this.sellerid = sellerid;  
  212.             }  
  213.   
  214.             public String getSubhead() {  
  215.                 return subhead;  
  216.             }  
  217.   
  218.             public void setSubhead(String subhead) {  
  219.                 this.subhead = subhead;  
  220.             }  
  221.   
  222.             public String getTitle() {  
  223.                 return title;  
  224.             }  
  225.   
  226.             public void setTitle(String title) {  
  227.                 this.title = title;  
  228.             }  
  229.         }  
  230.     }  
  231. }  

三 model

1.1 实现详情页model层的接口

[java]  view plain  copy
  1. import com.bwie.changwanlei.myapplication.bean.XQBean;  
  2. import com.bwie.changwanlei.myapplication.net.CGSB;  
  3.   
  4.   
  5. public interface XQjieKou {  
  6.     public void getXQ(int pid, String str, final CGSB<XQBean> cgsb);  
  7. }  

1.2 实现详情页model

[java]  view plain  copy
  1. import com.bwie.changwanlei.myapplication.bean.Tianjia;  
  2. import com.bwie.changwanlei.myapplication.bean.XQBean;  
  3. import com.bwie.changwanlei.myapplication.net.CGSB;  
  4. import com.bwie.changwanlei.myapplication.net.RetrofitHepler;  
  5. import io.reactivex.Flowable;  
  6. import io.reactivex.android.schedulers.AndroidSchedulers;  
  7. import io.reactivex.functions.Consumer;  
  8. import io.reactivex.schedulers.Schedulers;  
  9. public class XQModel implements XQjieKou {  
  10.     @Override  
  11.     public void getXQ(int pid, String str, final CGSB<XQBean> cgsb) {  
  12.         Flowable<XQBean> flowable = RetrofitHepler.getSerViceAPI().getXQ(pid, str);  
  13.         flowable.observeOn(AndroidSchedulers.mainThread())  
  14.                 .subscribeOn(Schedulers.io())  
  15.                 .subscribe(new Consumer<XQBean>() {  
  16.                     @Override  
  17.                     public void accept(XQBean xqBean) throws Exception {  
  18.                         cgsb.chengGong(xqBean);  
  19.                     }  
  20.                 });  
  21.     }  
  22.     public void getTJ(int uid, int pid, String str, final CGSB<Tianjia> cgsb){  
  23.         Flowable<Tianjia> flowable = RetrofitHepler.getSerViceAPI().getMsg(uid, pid, str);  
  24.         flowable.observeOn(AndroidSchedulers.mainThread())  
  25.                 .subscribeOn(Schedulers.io())  
  26.                 .subscribe(new Consumer<Tianjia>() {  
  27.                     @Override  
  28.                     public void accept(Tianjia tianjia) throws Exception {  
  29.                         cgsb.chengGong(tianjia);  
  30.                     }  
  31.                 });  
  32.     }}  

1.3  购物车的model

[java]  view plain  copy
  1. import com.bwie.changwanlei.myapplication.bean.CartBean;  
  2. import com.bwie.changwanlei.myapplication.net.CGSB;  
  3. import com.bwie.changwanlei.myapplication.net.RetrofitHepler;  
  4. import io.reactivex.Flowable;  
  5. import io.reactivex.android.schedulers.AndroidSchedulers;  
  6. import io.reactivex.functions.Consumer;  
  7. import io.reactivex.schedulers.Schedulers;  
  8. public class CarModel {  
  9.     public void getCart(int uid, String str, final CGSB<CartBean> cgsb){  
  10.         Flowable<CartBean> flowable = RetrofitHepler.getSerViceAPI().getCart(uid,str);  
  11.         flowable.observeOn(AndroidSchedulers.mainThread())  
  12.                 .subscribeOn(Schedulers.io())  
  13.                 .subscribe(new Consumer<CartBean>() {  
  14.                     @Override  
  15.                     public void accept(CartBean cartBean) throws Exception {  
  16.                         cgsb.chengGong(cartBean);  
  17.                     }  
  18.                 });  
  19.     }  
  20. }  

1.4  设置一个数量和 价格的类   

CountAndPrice
[java]  view plain  copy
  1. public class CountAndPrice {  
  2.     private int count ;  
  3.     private int price;  
  4.   
  5.     public int getCount() {  
  6.         return count;  
  7.     }  
  8.   
  9.     public void setCount(int count) {  
  10.         this.count = count;  
  11.     }  
  12.   
  13.     public int getPrice() {  
  14.         return price;  
  15.     }  
  16.   
  17.     public void setPrice(int price) {  
  18.         this.price = price;  
  19.     }  
  20. }  

1.5  EVenbus

[java]  view plain  copy
  1. public class MessgeEvent {  
  2.     private boolean check;  
  3.   
  4.     public boolean isCheck() {  
  5.         return check;  
  6.     }  
  7.   
  8.     public void setCheck(boolean check) {  
  9.         this.check = check;  
  10.     }  
  11. }  
四   P层

1.1 详情页的P层

[java]  view plain  copy
  1. import com.bwie.changwanlei.myapplication.Iview;  
  2. import com.bwie.changwanlei.myapplication.bean.Tianjia;  
  3. import com.bwie.changwanlei.myapplication.bean.XQBean;  
  4. import com.bwie.changwanlei.myapplication.model.XQModel;  
  5. import com.bwie.changwanlei.myapplication.net.CGSB;  
  6.    
  7. public class XQPersenter {  
  8.     private final XQModel xqModel;  
  9.     private Iview iview;  
  10.     public XQPersenter(Iview iview) {  
  11.         xqModel = new XQModel();  
  12.         this.iview=iview;  
  13.     }  
  14.     public void getXQ(){  
  15.         xqModel.getXQ(12"android"new CGSB<XQBean>() {  
  16.             @Override  
  17.             public void chengGong(XQBean xqBean) {  
  18.                 iview.showBean(xqBean);  
  19.             }  
  20.         });  
  21.     }  
  22.     public void getTJ(){  
  23.         xqModel.getTJ(304312"android"new CGSB<Tianjia>() {  
  24.             @Override  
  25.             public void chengGong(Tianjia tianjia) {  
  26.                 iview.showStr(tianjia.getMsg());  
  27.             }  
  28.         });  
  29.     }  
  30. }  

1.2 购物车的P层

[java]  view plain  copy
  1. import com.bwie.changwanlei.myapplication.ICart;  
  2. import com.bwie.changwanlei.myapplication.bean.CartBean;  
  3. import com.bwie.changwanlei.myapplication.model.CarModel;  
  4. import com.bwie.changwanlei.myapplication.net.CGSB;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7.   
  8. public class CartPersenter {  
  9.     private ICart iCart;  
  10.     private final CarModel cartModel;  
  11.   
  12.     public CartPersenter(ICart iCart) {  
  13.         this.iCart = iCart;  
  14.         cartModel = new CarModel();  
  15.   
  16.     }  
  17.     public void getCart(){  
  18.         cartModel.getCart(3043,"android",new CGSB<CartBean>(){  
  19.   
  20.             @Override  
  21.             public void chengGong(CartBean cartBean) {  
  22.                 List<CartBean.DataBean> grouplist = cartBean.getData();  
  23.                 List<List<CartBean.DataBean.ListBean>> childlist = new ArrayList<>();  
  24.                 for (int i = 0; i < grouplist.size(); i++) {  
  25.                     CartBean.DataBean dataBean = grouplist.get(i);  
  26.                     List<CartBean.DataBean.ListBean> list = dataBean.getList();  
  27.                     childlist.add(list);  
  28.                 }  
  29.                 iCart.showlist(grouplist,childlist);  
  30.             }  
  31.         });  
  32.     }  
  33.   
  34. }  

五、适配器

MyExpandableAdapter
[java]  view plain  copy
  1. import android.content.Context;  
  2. import android.net.Uri;  
  3.   
  4. import android.view.View;  
  5. import android.view.ViewGroup;  
  6. import android.widget.BaseExpandableListAdapter;  
  7. import android.widget.CheckBox;  
  8. import android.widget.ImageView;  
  9. import android.widget.TextView;  
  10. import android.widget.Toast;  
  11. import com.bwie.changwanlei.myapplication.R;  
  12. import com.bwie.changwanlei.myapplication.bean.CartBean;  
  13. import com.bwie.changwanlei.myapplication.model.CountAndPrice;  
  14. import com.bwie.changwanlei.myapplication.model.MessgeEvent;  
  15. import com.facebook.drawee.view.SimpleDraweeView;  
  16. import java.util.List;  
  17. import de.greenrobot.event.EventBus;  
  18.   
  19. /** 
  20.  * Created by Administrator on 2017/12/19. 
  21.  */  
  22.   
  23. public class MyExpandableAdapter extends BaseExpandableListAdapter {  
  24.     private List<CartBean.DataBean> groupdata;  
  25.     private Context context;  
  26.     private List<List<CartBean.DataBean.ListBean>> childlist;  
  27.   
  28.     public MyExpandableAdapter( List<CartBean.DataBean> groupdata, Context context, List<List<CartBean.DataBean.ListBean>> childlist) {  
  29.         this.groupdata = groupdata;  
  30.         this.context = context;  
  31.         this.childlist = childlist;  
  32.     }  
  33.   
  34.     @Override  
  35.     public int getGroupCount() {  
  36.         return groupdata.size();  
  37.     }  
  38.   
  39.     @Override  
  40.     public int getChildrenCount(int groupPosition) {  
  41.         return childlist.get(groupPosition).size();  
  42.     }  
  43.   
  44.     @Override  
  45.     public Object getGroup(int groupPosition) {  
  46.         return groupdata.get(groupPosition);  
  47.     }  
  48.   
  49.     @Override  
  50.     public Object getChild(int groupPosition, int childPosition) {  
  51.         return null;  
  52.     }  
  53.   
  54.     @Override  
  55.     public long getGroupId(int groupPosition) {  
  56.         return groupPosition;  
  57.     }  
  58.   
  59.     @Override  
  60.     public long getChildId(int groupPosition, int childPosition) {  
  61.         return childPosition;  
  62.     }  
  63.   
  64.     @Override  
  65.     public boolean hasStableIds() {  
  66.         return false;  
  67.     }  
  68.   
  69.     @Override  
  70.     public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {  
  71.         final GroupViewHolder holder;  
  72.         if (convertView == null) {  
  73.             convertView = View.inflate(context, R.layout.groupitem, null);  
  74.             holder = new GroupViewHolder();  
  75.             holder.tv_group = (TextView) convertView.findViewById(R.id.tv_group);  
  76.             holder.group_cb = (CheckBox) convertView.findViewById(R.id.gx_group);  
  77.   
  78.             convertView.setTag(holder);  
  79.         } else {  
  80.             holder = (GroupViewHolder) convertView.getTag();  
  81.         }  
  82.         final CartBean.DataBean dataBean = groupdata.get(groupPosition);  
  83.   
  84.         String sellerName = dataBean.getSellerName();  
  85.         holder.group_cb.setChecked(dataBean.isCheck());  
  86.         //点击一级checkbox的状态  
  87.         holder.group_cb.setOnClickListener(new View.OnClickListener() {  
  88.             @Override  
  89.             public void onClick(View v) {  
  90.                 dataBean.setCheck(holder.group_cb.isChecked());  
  91.                 //改变所有孩子的状态  
  92.                 changeChildState(groupPosition,holder.group_cb.isChecked());  
  93.                 EventBus.getDefault().post(jS());  
  94.                 //通过判断一级的checkbox判断全选的状态  
  95.                 changeMianQXstatus(checkGroupAll());  
  96.                 notifyDataSetChanged();  
  97.             }  
  98.         });  
  99.   
  100.   
  101.         return convertView;  
  102.     }  
  103.   
  104.     @Override  
  105.     public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {  
  106.         final ChildViewHolder holder;  
  107.         if (convertView == null) {  
  108.             convertView = View.inflate(context, R.layout.childitem, null);  
  109.             holder = new ChildViewHolder();  
  110.   
  111.             holder.tv_title= (TextView) convertView.findViewById(R.id.title);  
  112.             holder.price= (TextView) convertView.findViewById(R.id.price);                //价格  
  113.             holder.child_cb= (CheckBox) convertView.findViewById(R.id.gouxuan_child);   //子勾选  
  114.             holder.jian= (ImageView) convertView.findViewById(R.id.jia);     //加加  
  115.             holder.del= (ImageView) convertView.findViewById(R.id.del);      //删除  
  116.             holder.add= (ImageView) convertView.findViewById(R.id.jian);    //减  
  117.             holder.sdv= (SimpleDraweeView) convertView.findViewById(R.id.title_img);  
  118.             holder.tv_num= (TextView) convertView.findViewById(R.id.tv_num);  //数量  
  119.             holder.yanse= (TextView) convertView.findViewById(R.id.yanse);  
  120.             convertView.setTag(holder);  
  121.         } else {  
  122.             holder = (ChildViewHolder) convertView.getTag();  
  123.         }  
  124.         final CartBean.DataBean.ListBean listBean = childlist.get(groupPosition).get(childPosition);  
  125.         int price = (int) listBean.getPrice();  
  126.         holder.child_cb.setChecked(listBean.isCheck());  
  127.         holder.price.setText("¥:"+price+"");  
  128.         String title = listBean.getTitle();  
  129.         holder.tv_title.setText(title);  
  130.         String subhead = listBean.getSubhead();  
  131.         String substring = subhead.substring(110)+".....";  
  132.         holder.yanse.setText(substring);  
  133.         String images = listBean.getImages();  
  134.         String[] split = images.split("\\|");  
  135.         String s = split[0];  
  136.         Uri uri=Uri.parse(s);  
  137.         holder.sdv.setImageURI(uri);  
  138.         //   listBean.setCou(Integer.parseInt(holder.tv_num.getText().toString()));  
  139.         //给子条目的checkBox点击事件  
  140.         holder.child_cb.setOnClickListener(new View.OnClickListener() {  
  141.             @Override  
  142.             public void onClick(View v) {  
  143.                 listBean.setCheck(holder.child_cb.isChecked());  
  144.   
  145.                 EventBus.getDefault().post(jS());  
  146.                 //如果二级的checkBox选中,就让一级的checkBox勾选  
  147.                 if(holder.child_cb.isChecked()) {  
  148.   
  149.                     if (ischeckAllchild(groupPosition)) {  
  150.                         //改变一级checkBox的状态  
  151.                         changeGroupstatus(groupPosition,true);  
  152.                         //通过判断一级的CheckBox的状态来改变全选的状态  
  153.                         changeMianQXstatus(checkGroupAll());  
  154.   
  155.                     }  
  156.                 }else{  
  157.                     changeGroupstatus(groupPosition,false);  
  158.                     changeMianQXstatus(checkGroupAll());  
  159.                 }  
  160.                 notifyDataSetChanged();  
  161.             }  
  162.   
  163.         });  
  164.   
  165.         //点击加加的功能  
  166.         holder.add.setOnClickListener(new View.OnClickListener() {  
  167.             @Override  
  168.             public void onClick(View v) {  
  169.                 int cou = listBean.getCou();  
  170.                 holder.tv_num.setText(++cou+"");  
  171.                 listBean.setCou(cou);  
  172.                 if(holder.child_cb.isChecked()){  
  173.                     EventBus.getDefault().post(jS());  
  174.                 }  
  175.   
  176.             }  
  177.         });  
  178.         //点击减减的功能  
  179.         holder.jian.setOnClickListener(new View.OnClickListener() {  
  180.             @Override  
  181.             public void onClick(View v) {  
  182.                 int cou = listBean.getCou();  
  183.   
  184.                 if(cou==1) {  
  185.                     Toast.makeText(context, "最小数量为1", Toast.LENGTH_SHORT).show();  
  186.                     return;}  
  187.                 holder.tv_num.setText(--cou+"");  
  188.                 listBean.setCou(cou);  
  189.                 if (holder.child_cb.isChecked()) {  
  190.                     EventBus.getDefault().post(jS());  
  191.   
  192.                 }  
  193.             }  
  194.         });  
  195.         //点击删除  
  196.         holder.del.setOnClickListener(new View.OnClickListener() {  
  197.             @Override  
  198.             public void onClick(View v) {  
  199.                 List<CartBean.DataBean.ListBean> listBeen = childlist.get(groupPosition);  
  200.   
  201.                 CartBean.DataBean.ListBean remove = listBeen.remove(childPosition);  
  202.                 if(listBeen.size()==0){  
  203.                     childlist.remove(childPosition);  
  204.                     groupdata.remove(groupPosition);  
  205.                 }  
  206.                 EventBus.getDefault().post(jS());  
  207.                 notifyDataSetChanged();  
  208.   
  209.             }  
  210.         });  
  211.   
  212.         return convertView;  
  213.     }  
  214.   
  215.     @Override  
  216.     public boolean isChildSelectable(int groupPosition, int childPosition) {  
  217.         return true;  
  218.     }  
  219.   
  220.     class GroupViewHolder {  
  221.         CheckBox group_cb;  
  222.         TextView tv_group;  
  223.     }  
  224.   
  225.     class ChildViewHolder {  
  226.         CheckBox child_cb;  
  227.         TextView tv_title,price,yanse,tv_num;  
  228.         ImageView del,add,jian;  
  229.         SimpleDraweeView sdv;  
  230.   
  231.   
  232.     }  
  233.     /** 
  234.      * 判断全部的二级是CheckBox否选中 
  235.      * 
  236.      */  
  237.     private boolean ischeckAllchild(int g){  
  238.         List<CartBean.DataBean.ListBean> listBeen = childlist.get(g);  
  239.   
  240.         for (int i = 0; i <listBeen.size() ; i++) {  
  241.             CartBean.DataBean.ListBean listBean = listBeen.get(i);  
  242.   
  243.             if(!listBean.isCheck()){  
  244.                 return false;  
  245.             }  
  246.         }  
  247.         return true;  
  248.     }  
  249.   
  250.     /** 
  251.      * 计算数量和价格 
  252.      * 通过遍历一级的得到二级的CheckBox,如果是选择的选中状态的话,就统计它们的总计的数量和价格 
  253.      */  
  254.     private CountAndPrice jS(){  
  255.         int cou=0;  
  256.         int jiage=0;  
  257.         for (int i = 0; i <groupdata.size() ; i++) {  
  258.             for (int j = 0; j <childlist.get(i).size() ; j++) {  
  259.                 CartBean.DataBean.ListBean listBean = childlist.get(i).get(j);  
  260.                 if(listBean.isCheck()){  
  261.                     cou+=listBean.getCou();  
  262.                     jiage+=(int)listBean.getPrice()*listBean.getCou();  
  263.                 }  
  264.   
  265.             }  
  266.   
  267.         }  
  268.         CountAndPrice countAndPrice = new CountAndPrice();  
  269.         countAndPrice.setCount(cou);  
  270.         countAndPrice.setPrice(jiage);  
  271.         return countAndPrice;  
  272.     }  
  273.     /** 
  274.      * 改变一级列表的状态 
  275.      */  
  276.     private void changeGroupstatus(int groupPosition,boolean flag ){  
  277.         CartBean.DataBean dataBean = groupdata.get(groupPosition);  
  278.   
  279.         dataBean.setCheck(flag);  
  280.     }  
  281.     /** 
  282.      * 改变全选的状态 
  283.      * 
  284.      */  
  285.     private void changeMianQXstatus(boolean flag){  
  286.         MessgeEvent messgeEvent = new MessgeEvent();  
  287.         messgeEvent.setCheck(flag);  
  288.         EventBus.getDefault().post(messgeEvent);  
  289.     }  
  290.     /** 
  291.      * 判断一级的是否全部选中 
  292.      */  
  293.     private boolean checkGroupAll(){  
  294.         for (int i = 0; i < groupdata.size(); i++) {  
  295.             if(!groupdata.get(i).isCheck()){  
  296.                 return false;  
  297.             }  
  298.         }  
  299.         return true;  
  300.     }  
  301.     /** 
  302.      * 改变所有孩子的状态 
  303.      */  
  304.     private void changeChildState(int grouPistion,boolean flag){  
  305.         List<CartBean.DataBean.ListBean> listBeen = childlist.get(grouPistion);  
  306.         for (int i = 0; i < listBeen.size(); i++) {  
  307.             listBeen.get(i).setCheck(flag);  
  308.         }  
  309.     }  
  310.     /** 
  311.      * 改变全选的 
  312.      */  
  313.     public void qx(boolean flag){  
  314.         for (int i = 0; i < groupdata.size(); i++) {  
  315.             changeGroupstatus(i, flag);  
  316.             changeChildState(i, flag);  
  317.         }  
  318.         EventBus.getDefault().post(jS());  
  319.         notifyDataSetChanged();  
  320.     }  
  321. }  

六  V层

1.1 Main2

XML 

[java]  view plain  copy
  1. <span style="color:#FF0000;">activity_main2</span>  

[java]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:id="@+id/activity_main2"  
  5.     android:layout_width="match_parent"  
  6.     android:layout_height="match_parent"  
  7.     android:paddingBottom="@dimen/activity_vertical_margin"  
  8.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  9.     android:paddingRight="@dimen/activity_horizontal_margin"  
  10.     android:paddingTop="@dimen/activity_vertical_margin"  
  11.     android:orientation="vertical"  
  12.     tools:context="com.bwie.changwanlei.myapplication.view.Main2Activity">  
  13.     <com.facebook.drawee.view.SimpleDraweeView  
  14.         android:layout_width="300dp"  
  15.         android:id="@+id/xqsdv1"  
  16.         android:layout_gravity="center"  
  17.         android:layout_height="300dp" />  
  18.     <TextView  
  19.         android:id="@+id/tvtitle1"  
  20.         android:layout_width="match_parent"  
  21.         android:layout_height="wrap_content" />  
  22.     <LinearLayout  
  23.         android:orientation="horizontal"  
  24.         android:layout_width="match_parent"  
  25.         android:layout_height="wrap_content">  
  26.         <Button  
  27.             android:id="@+id/tiaozhuan1"  
  28.             android:layout_weight="1"  
  29.             android:text="跳转到购物车"  
  30.             android:layout_width="match_parent"  
  31.             android:layout_height="wrap_content" />  
  32.         <Button  
  33.             android:id="@+id/tianjia1"  
  34.             android:layout_weight="1"  
  35.             android:text="添加到购物车"  
  36.             android:layout_width="match_parent"  
  37.             android:layout_height="wrap_content" />  
  38.     </LinearLayout>  
  39. </LinearLayout>  


[java]  view plain  copy
  1. <span style="font-size:18px;color:#FF0000;">Main2Activity </span>  


[java]  view plain  copy
  1. import android.content.Intent;  
  2. import android.net.Uri;  
  3. import android.os.Bundle;  
  4. import android.support.v7.app.AppCompatActivity;  
  5. import android.view.View;  
  6. import android.widget.Button;  
  7. import android.widget.LinearLayout;  
  8. import android.widget.TextView;  
  9. import android.widget.Toast;  
  10. import com.bwie.changwanlei.myapplication.Iview;  
  11. import com.bwie.changwanlei.myapplication.R;  
  12. import com.bwie.changwanlei.myapplication.bean.XQBean;  
  13. import com.bwie.changwanlei.myapplication.persenter.XQPersenter;  
  14. import com.facebook.drawee.view.SimpleDraweeView;  
  15.   
  16. public class Main2Activity extends AppCompatActivity implements View.OnClickListener,Iview {  
  17.     private SimpleDraweeView mXqsdv;  
  18.     private TextView mTvtitle;  
  19.     /** 
  20.      * 跳转到购物车 
  21.      */  
  22.     private Button mTiaozhuan;  
  23.     /** 
  24.      * 添加到购物车 
  25.      */  
  26.     private Button mTianjia;  
  27.     private LinearLayout mActivityMain2;  
  28.     private XQPersenter xqPersenter;  
  29.   
  30.     @Override  
  31.     protected void onCreate(Bundle savedInstanceState) {  
  32.         super.onCreate(savedInstanceState);  
  33.         setContentView(R.layout.activity_main2);  
  34.         initView();  
  35.         xqPersenter = new XQPersenter(this);  
  36.         xqPersenter.getXQ();  
  37.     }  
  38.     private void initView() {  
  39.         mXqsdv = (SimpleDraweeView) findViewById(R.id.xqsdv1);  
  40.         mTvtitle = (TextView) findViewById(R.id.tvtitle1);  
  41.         mTiaozhuan = (Button) findViewById(R.id.tiaozhuan1);  
  42.         mTiaozhuan.setOnClickListener(this);  
  43.         mTianjia = (Button) findViewById(R.id.tianjia1);  
  44.         mTianjia.setOnClickListener(this);  
  45.         mActivityMain2 = (LinearLayout) findViewById(R.id.activity_main2);  
  46.     }  
  47.     @Override  
  48.     public void onClick(View v) {  
  49.         switch (v.getId()) {  
  50.             default:  
  51.                 break;  
  52.             case R.id.tiaozhuan1:  
  53.                 startActivity(<span style="font-size:18px;color:#FF0000;">new Intent(this,MainActivity.class))</span>;//跳到MainActivity (购物车)  
  54.                 break;  
  55.             case R.id.tianjia1:  
  56.                 xqPersenter.getTJ();  
  57.                 break;  
  58.         }  
  59.     }  
  60.     @Override  
  61.     public void showBean(Object o) {  
  62.         XQBean xqBean = (XQBean) o;  
  63.         XQBean.DataBean data = xqBean.getData();  
  64.         String s = data.getImages().split("\\|")[0];  
  65.         Uri uri =Uri.parse(s);//地址转换成URI  
  66.         mXqsdv.setImageURI(uri);  
  67.         mTvtitle.setText(data.getTitle()+"\n"+data.getPrice());  
  68.     }  
  69.     @Override  
  70.     public void showStr(String s) {  
  71.         Toast.makeText(this, s, Toast.LENGTH_SHORT).show();  
  72.     }  
  73. }  

1.2 Main

XML

[java]  view plain  copy
  1. <span style="color:#FF0000;">activity_main</span>  

[java]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:id="@+id/activity_main"  
  5.     android:layout_width="match_parent"  
  6.     android:layout_height="match_parent"  
  7.     android:paddingBottom="@dimen/activity_vertical_margin"  
  8.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  9.     android:paddingRight="@dimen/activity_horizontal_margin"  
  10.     android:paddingTop="@dimen/activity_vertical_margin"  
  11.     android:orientation="vertical"  
  12.     tools:context="com.bwie.changwanlei.myapplication.view.MainActivity">  
  13.   
  14.     <ExpandableListView  
  15.         android:id="@+id/elv"  
  16.         android:layout_weight="1"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="wrap_content" />  
  19.     <LinearLayout  
  20.         android:layout_weight="9"  
  21.         android:orientation="horizontal"  
  22.         android:layout_width="match_parent"  
  23.         android:layout_height="match_parent">  
  24.         <CheckBox  
  25.             android:id="@+id/quanxuan"  
  26.             android:layout_width="wrap_content"  
  27.             android:layout_height="wrap_content" />  
  28.         <TextView  
  29.             android:text="全选"  
  30.             android:layout_width="wrap_content"  
  31.             android:layout_height="wrap_content" />  
  32.         <LinearLayout  
  33.             android:layout_marginLeft="50dp"  
  34.             android:orientation="vertical"  
  35.             android:layout_width="wrap_content"  
  36.             android:layout_height="wrap_content">  
  37.             <TextView  
  38.                 android:id="@+id/zongjia"  
  39.                 android:layout_width="wrap_content"  
  40.                 android:layout_height="wrap_content"  
  41.                 android:text="总价:0.0"  
  42.                 />  
  43.             <TextView  
  44.                 android:text="共0件商品"  
  45.                 android:id="@+id/tv_count"  
  46.                 android:layout_width="wrap_content"  
  47.                 android:layout_height="wrap_content" />  
  48.   
  49.         </LinearLayout>  
  50.         <TextView  
  51.             android:text="去结算"  
  52.             android:background="#FFD82020"  
  53.             android:layout_marginLeft="100dp"  
  54.             android:layout_width="wrap_content"  
  55.             android:layout_height="wrap_content" />  
  56.     </LinearLayout>  
  57. </LinearLayout>  

[java]  view plain  copy
  1. <span style="font-size:18px;color:#FF0000;">MainActivity</span>  


[java]  view plain  copy
  1. import android.support.v7.app.AppCompatActivity;  
  2. import android.os.Bundle;  
  3. import android.view.View;  
  4. import android.widget.CheckBox;  
  5. import android.widget.ExpandableListView;  
  6. import android.widget.TextView;  
  7.   
  8. import com.bwie.changwanlei.myapplication.ICart;  
  9. import com.bwie.changwanlei.myapplication.R;  
  10. import com.bwie.changwanlei.myapplication.adapter.MyExpandableAdapter;  
  11. import com.bwie.changwanlei.myapplication.bean.CartBean;  
  12. import com.bwie.changwanlei.myapplication.model.CountAndPrice;  
  13. import com.bwie.changwanlei.myapplication.model.MessgeEvent;  
  14. import com.bwie.changwanlei.myapplication.persenter.CartPersenter;  
  15.   
  16. import java.util.List;  
  17.   
  18. import de.greenrobot.event.EventBus;  
  19. import de.greenrobot.event.Subscribe;  
  20.   
  21. public class MainActivity extends AppCompatActivity implements ICart {  
  22.     private ExpandableListView mElv;  
  23.     private CheckBox mQuanxuan;  
  24.     /** 
  25.      * 总价:0.0 
  26.      */  
  27.     private TextView mZongjia;  
  28.     /** 
  29.      * 共0件商品 
  30.      */  
  31.     private TextView mTvCount;  
  32.     private MyExpandableAdapter myExpandableAdapter;  
  33.   
  34.     @Override  
  35.     protected void onCreate(Bundle savedInstanceState) {  
  36.         super.onCreate(savedInstanceState);  
  37.         setContentView(R.layout.activity_main);  
  38.         initView();  
  39.         new CartPersenter(this).getCart();  
  40.         EventBus.getDefault().register(this);  
  41.         mQuanxuan.setOnClickListener(new View.OnClickListener() {  
  42.             @Override  
  43.             public void onClick(View v) {  
  44.                 myExpandableAdapter.qx(mQuanxuan.isChecked());  
  45.             }  
  46.         });  
  47.     }  
  48.   
  49.     @Override  
  50.     public void showlist(List<CartBean.DataBean> grouplist, List<List<CartBean.DataBean.ListBean>> childlist) {  
  51.         myExpandableAdapter = new MyExpandableAdapter(grouplist, this,childlist);  
  52.         mElv.setAdapter(myExpandableAdapter);  
  53.         for (int i = 0; i <grouplist.size() ; i++) {  
  54.             mElv.expandGroup(i);  
  55.         }  
  56.   
  57.     }  
  58.   
  59.     private void initView() {  
  60.         mElv = (ExpandableListView) findViewById(R.id.elv);  
  61.         mQuanxuan = (CheckBox) findViewById(R.id.quanxuan);  
  62.         mZongjia = (TextView) findViewById(R.id.zongjia);  
  63.         mTvCount = (TextView) findViewById(R.id.tv_count);  
  64.     }  
  65.     //接收传过来的值  
  66.     @Subscribe  
  67.     public void onPriceAndCount(CountAndPrice cp){  
  68.   
  69.   
  70.         mZongjia.setText("共"+cp.getCount()+"件商品");  
  71.         mTvCount.setText("总计:"+cp.getPrice());  
  72.   
  73.     }  
  74.     //接收传过来的值  
  75.     @Subscribe  
  76.     public void onPriceAndCount1(MessgeEvent event){  
  77.         //改变全选的状态  
  78.         mQuanxuan.setChecked(event.isCheck());  
  79.     }  
  80.     @Override  
  81.     protected void onDestroy() {  
  82.         super.onDestroy();  
  83.         EventBus.getDefault().unregister(this);  
  84.     }  
  85. }  

1.3 Icart  (
[java]  view plain  copy
  1. MainActivity去 实现  

[java]  view plain  copy
  1. <span style="font-size:14px;">import java.util.List;  
  2.   
  3.   
  4. public interface ICart{  
  5.     void showlist(List<CartBean.DataBean> grouplist, List<List<CartBean.DataBean.ListBean>> childlist);  
  6. }</span>  
1.4 
[java]  view plain  copy
  1. <span style="font-size:18px;color:#FF0000;"></span>  
[java]  view plain  copy
  1. MainActivity2 去实现  
Iview
 
  
[java]  view plain  copy
  1. <span style="font-size:14px;">public interface Iview<T> {  
  2.     void showBean(T t);  
  3.     void showStr(String s);  
  4. }</span>  
1.5 MyApp

[java]  view plain  copy
  1. <span style="font-size:14px;">import android.app.Application;  
  2.   
  3. import com.facebook.drawee.backends.pipeline.Fresco;  
  4.   
  5. /** 
  6.  * Created by Administrator on 2017/12/19. 
  7.  */  
  8.   
  9. public class MyApp extends Application {  
  10.     @Override  
  11.     public void onCreate() {  
  12.         Fresco.initialize(this);  
  13.     }  
  14. }</span>  

childitem

[java]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical" android:layout_width="match_parent"  
  4.     android:layout_height="match_parent">  
  5.     <TextView  
  6.         android:id="@+id/title"  
  7.         android:layout_marginLeft="20dp"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="wrap_content" />  
  10.     <LinearLayout  
  11.         android:orientation="horizontal"  
  12.         android:layout_width="wrap_content"  
  13.         android:layout_height="wrap_content">  
  14.         <CheckBox  
  15.             android:layout_marginLeft="20dp"  
  16.             android:gravity="center_vertical"  
  17.             android:id="@+id/gouxuan_child"  
  18.             android:layout_width="wrap_content"  
  19.             android:layout_height="wrap_content" />  
  20.         <com.facebook.drawee.view.SimpleDraweeView  
  21.             android:gravity="center_vertical"  
  22.             android:id="@+id/title_img"  
  23.             android:layout_width="50dp"  
  24.             android:layout_height="50dp" />  
  25.         <LinearLayout  
  26.             android:orientation="vertical"  
  27.             android:layout_marginLeft="30dp"  
  28.             android:layout_width="wrap_content"  
  29.             android:layout_height="wrap_content">  
  30.             <TextView  
  31.                 android:id="@+id/price"  
  32.                 android:layout_marginLeft="10dp"  
  33.                 android:layout_width="wrap_content"  
  34.                 android:layout_height="wrap_content" />  
  35.             <TextView  
  36.                 android:id="@+id/yanse"  
  37.                 android:layout_marginLeft="10dp"  
  38.                 android:layout_width="wrap_content"  
  39.                 android:layout_height="wrap_content" />  
  40.             <LinearLayout  
  41.                 android:layout_marginLeft="100dp"  
  42.                 android:orientation="horizontal"  
  43.                 android:layout_width="wrap_content"  
  44.                 android:layout_height="wrap_content">  
  45.                 <ImageView  
  46.                     android:id="@+id/jian"  
  47.                     android:layout_width="20dp"  
  48.                     android:layout_height="20dp"  
  49.                     android:src="@drawable/shopcart_add_red" />  
  50.   
  51.                 <TextView  
  52.                     android:id="@+id/tv_num"  
  53.                     android:layout_width="wrap_content"  
  54.                     android:layout_height="wrap_content"  
  55.                     android:layout_marginLeft="5dp"  
  56.                     android:background="@drawable/ite"  
  57.                     android:paddingBottom="2dp"  
  58.                     android:paddingLeft="20dp"  
  59.                     android:paddingRight="20dp"  
  60.                     android:paddingTop="2dp"  
  61.                     android:text="1" />  
  62.   
  63.                 <ImageView  
  64.                     android:id="@+id/jia"  
  65.                     android:layout_width="20dp"  
  66.                     android:layout_height="20dp"  
  67.                     android:layout_marginLeft="5dp"  
  68.                     android:src="@drawable/shopcart_minus_red" />  
  69.             </LinearLayout>  
  70.   
  71.         </LinearLayout>  
  72.         <ImageView  
  73.             android:id="@+id/del"  
  74.             android:layout_marginLeft="20dp"  
  75.             android:background="@drawable/a"  
  76.             android:layout_width="32dp"  
  77.             android:layout_height="29dp" />  
  78.     </LinearLayout>  
  79. </LinearLayout>  

groupitem

[java]  view plain  copy
  1. <span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="horizontal" android:layout_width="match_parent"  
  4.     android:layout_height="match_parent">  
  5.     <CheckBox  
  6.         android:id="@+id/gx_group"  
  7.         android:focusable="false"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content" />  
  10.     <TextView  
  11.         android:id="@+id/tv_group"  
  12.         android:layout_width="wrap_content"  
  13.         android:layout_height="wrap_content" />  
  14. </LinearLayout></span>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值