一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Rxjava+Retrofit+MVP实现购物车功能

时间:2018-05-15 编辑:猪哥 来源:一聚教程网

本文实例为大家分享了Rxjava Retrofit实现购物车的具体代码,供大家参考,具体内容如下

效果图:

1.依赖

annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' 
 compile 'com.jakewharton:butterknife:8.8.1' 
 compile 'com.android.support:recyclerview-v7:26.0.0-alpha1' 
 compile 'com.squareup.retrofit2:retrofit:2.3.0' 
 compile 'com.squareup.retrofit2:converter-gson:2.3.0' 
 compile 'com.facebook.fresco:fresco:0.12.0' 
 compile 'com.facebook.fresco:animated-base-support:0.12.0' 
 compile 'com.facebook.fresco:animated-webp:0.12.0' 
 compile 'com.facebook.fresco:webpsupport:0.12.0' 
 compile 'io.reactivex.rxjava2:rxjava:2.1.7' 
 compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' 
 compile 'io.reactivex.rxjava2:rxandroid:2.0.1' 
 compile 'com.squareup.okhttp3:okhttp:3.9.0' 
 compile 'com.google.code.gson:gson:2.8.1' 

2.布局

1.加减器布局   layout_add_delete

 
 
 
  
 
  
  
 
 
 

2. 商品详情布局   activity_main

 
 
 
 
  
 
  
 
  
 
  
 
  
 
 
  
 
  
 
 

3.购物车布局 activity_main2

 
 
 
  
  
 
  
 
   
 
   
 
   
  
  
 
  
  
 
  
 
  
  
  
   
   
    
 
    
   
   
   
   
   
  
 
  
 

4.二级列表组级布局 ex_group_item

 
 
 
  
 
  
 
 

5.二级列表子布局  ex_child_item

 
 
 
  
 
  
 
  
 
  
  
 
  
 
  
  
 
 

3.实体类

1. MessageBean

package com.bwei.gepeng.entity; 
 
public class MessageBean { 
 
 
 private String code; 
 private T data; 
 private String msg; 
 private SellerBean seller; 
 
 public String getCode() { 
 return code; 
 } 
 
 public void setCode(String code) { 
 this.code = code; 
 } 
 
 public T getData() { 
 return data; 
 } 
 
 public void setData(T data) { 
 this.data = data; 
 } 
 
 public String getMsg() { 
 return msg; 
 } 
 
 public void setMsg(String msg) { 
 this.msg = msg; 
 } 
 
 public SellerBean getSeller() { 
 return seller; 
 } 
 
 public void setSeller(SellerBean seller) { 
 this.seller = seller; 
 } 
 
 
 
 public static class SellerBean { 
 /** 
  * description : 我是商家19 
  * icon : http://120.27.23.105/images/icon.png 
  * name : 商家19 
  * productNums : 999 
  * score : 5.0 
  * sellerid : 19 
  */ 
 
 private String description; 
 private String icon; 
 private String name; 
 private int productNums; 
 private double score; 
 private int sellerid; 
 
 public String getDescription() { 
  return description; 
 } 
 
 public void setDescription(String description) { 
  this.description = description; 
 } 
 
 public String getIcon() { 
  return icon; 
 } 
 
 public void setIcon(String icon) { 
  this.icon = icon; 
 } 
 
 public String getName() { 
  return name; 
 } 
 
 public void setName(String name) { 
  this.name = name; 
 } 
 
 public int getProductNums() { 
  return productNums; 
 } 
 
 public void setProductNums(int productNums) { 
  this.productNums = productNums; 
 } 
 
 public double getScore() { 
  return score; 
 } 
 
 public void setScore(double score) { 
  this.score = score; 
 } 
 
 public int getSellerid() { 
  return sellerid; 
 } 
 
 public void setSellerid(int sellerid) { 
  this.sellerid = sellerid; 
 } 
 } 
} 

2.GoodsShowBean

package com.bwei.gepeng.entity; 
 
public class GoodsShowBean { 
 
 private double bargainPrice; 
 private String createtime; 
 private String detailUrl; 
 private String images; 
 private int itemtype; 
 private int pid; 
 private double price; 
 private int pscid; 
 private int salenum; 
 private int sellerid; 
 private String subhead; 
 private String title; 
 
 public double getBargainPrice() { 
  return bargainPrice; 
 } 
 
 public void setBargainPrice(double bargainPrice) { 
  this.bargainPrice = bargainPrice; 
 } 
 
 public String getCreatetime() { 
  return createtime; 
 } 
 
 public void setCreatetime(String createtime) { 
  this.createtime = createtime; 
 } 
 
 public String getDetailUrl() { 
  return detailUrl; 
 } 
 
 public void setDetailUrl(String detailUrl) { 
  this.detailUrl = detailUrl; 
 } 
 
 public String getImages() { 
  return images; 
 } 
 
 public void setImages(String images) { 
  this.images = images; 
 } 
 
 public int getItemtype() { 
  return itemtype; 
 } 
 
 public void setItemtype(int itemtype) { 
  this.itemtype = itemtype; 
 } 
 
 public int getPid() { 
  return pid; 
 } 
 
 public void setPid(int pid) { 
  this.pid = pid; 
 } 
 
 public double getPrice() { 
  return price; 
 } 
 
 public void setPrice(double price) { 
  this.price = price; 
 } 
 
 public int getPscid() { 
  return pscid; 
 } 
 
 public void setPscid(int pscid) { 
  this.pscid = pscid; 
 } 
 
 public int getSalenum() { 
  return salenum; 
 } 
 
 public void setSalenum(int salenum) { 
  this.salenum = salenum; 
 } 
 
 public int getSellerid() { 
  return sellerid; 
 } 
 
 public void setSellerid(int sellerid) { 
  this.sellerid = sellerid; 
 } 
 
 public String getSubhead() { 
  return subhead; 
 } 
 
 public void setSubhead(String subhead) { 
  this.subhead = subhead; 
 } 
 
 public String getTitle() { 
  return title; 
 } 
 
 public void setTitle(String title) { 
  this.title = title; 
 } 
 
 @Override 
 public String toString() { 
 return "GoodsShowBean{" + 
  "bargainPrice=" + bargainPrice + 
  ", createtime='" + createtime + ''' + 
  ", detailUrl='" + detailUrl + ''' + 
  ", images='" + images + ''' + 
  ", itemtype=" + itemtype + 
  ", pid=" + pid + 
  ", price=" + price + 
  ", pscid=" + pscid + 
  ", salenum=" + salenum + 
  ", sellerid=" + sellerid + 
  ", subhead='" + subhead + ''' + 
  ", title='" + title + ''' + 
  '}'; 
 } 
} 

3. CartBean

package com.bwei.gepeng.entity; 
 
import java.util.List; 
 
public class CartBean { 
 private String sellerName; 
 private String sellerid; 
 private List list; 
 
 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 getList() { 
 return list; 
 } 
 
 public void setList(List list) { 
 this.list = list; 
 } 
 
 public static class ListBean { 
 
 private double bargainPrice; 
 private String createtime; 
 private String detailUrl; 
 private String images; 
 private int num; 
 private int pid; 
 private double price; 
 private int pscid; 
 private int selected; 
 private int sellerid; 
 private String subhead; 
 private String title; 
 
 public double getBargainPrice() { 
  return bargainPrice; 
 } 
 
 public void setBargainPrice(double bargainPrice) { 
  this.bargainPrice = bargainPrice; 
 } 
 
 public String getCreatetime() { 
  return createtime; 
 } 
 
 public void setCreatetime(String createtime) { 
  this.createtime = createtime; 
 } 
 
 public String getDetailUrl() { 
  return detailUrl; 
 } 
 
 public void setDetailUrl(String detailUrl) { 
  this.detailUrl = detailUrl; 
 } 
 
 public String getImages() { 
  return images; 
 } 
 
 public void setImages(String images) { 
  this.images = images; 
 } 
 
 public int getNum() { 
  return num; 
 } 
 
 public void setNum(int num) { 
  this.num = num; 
 } 
 
 public int getPid() { 
  return pid; 
 } 
 
 public void setPid(int pid) { 
  this.pid = pid; 
 } 
 
 public double getPrice() { 
  return price; 
 } 
 
 public void setPrice(double price) { 
  this.price = price; 
 } 
 
 public int getPscid() { 
  return pscid; 
 } 
 
 public void setPscid(int pscid) { 
  this.pscid = pscid; 
 } 
 
 public int getSelected() { 
  return selected; 
 } 
 
 public void setSelected(int selected) { 
  this.selected = selected; 
 } 
 
 public int getSellerid() { 
  return sellerid; 
 } 
 
 public void setSellerid(int sellerid) { 
  this.sellerid = sellerid; 
 } 
 
 public String getSubhead() { 
  return subhead; 
 } 
 
 public void setSubhead(String subhead) { 
  this.subhead = subhead; 
 } 
 
 public String getTitle() { 
  return title; 
 } 
 
 public void setTitle(String title) { 
  this.title = title; 
 } 
 } 
 
 @Override 
 public String toString() { 
 return "CartBean{" + 
  "sellerName='" + sellerName + ''' + 
  ", sellerid='" + sellerid + ''' + 
  ", list=" + list + 
  '}'; 
 } 
} 

4. GroupBean

package com.bwei.gepeng.entity; 
 
public class GroupBean { 
 private String sellerName; 
 private boolean gropuCb; 
 
 public GroupBean(String sellerName, boolean gropuCb) { 
 this.sellerName = sellerName; 
 this.gropuCb = gropuCb; 
 } 
 
 public String getSellerName() { 
 return sellerName; 
 } 
 
 public void setSellerName(String sellerName) { 
 this.sellerName = sellerName; 
 } 
 
 public boolean isGropuCb() { 
 return gropuCb; 
 } 
 
 public void setGropuCb(boolean gropuCb) { 
 this.gropuCb = gropuCb; 
 } 
 
 @Override 
 public String toString() { 
 return "GroupBean{" + 
  "sellerName='" + sellerName + ''' + 
  ", gropuCb=" + gropuCb + 
  '}'; 
 } 
} 

5.ChildBean

package com.bwei.gepeng.entity; 
 
public class ChildBean { 
 private String title; 
 private String images; 
 private double price; 
 private int num; 
 private boolean childCb; 
 private boolean btn; 
 private int pid; 
 
 
 public ChildBean(String title, String images, double price, int num, boolean childCb, boolean btn, int pid) { 
 this.title = title; 
 this.images = images; 
 this.price = price; 
 this.num = num; 
 this.childCb = childCb; 
 this.btn = btn; 
 this.pid = pid; 
 } 
 
 public int getPid() { 
 return pid; 
 } 
 
 public void setPid(int pid) { 
 this.pid = pid; 
 } 
 
 public boolean isBtn() { 
 return btn; 
 } 
 
 public void setBtn(boolean btn) { 
 this.btn = btn; 
 } 
 
 
 public String getTitle() { 
 return title; 
 } 
 
 public void setTitle(String title) { 
 this.title = title; 
 } 
 
 public String getImages() { 
 return images; 
 } 
 
 public void setImages(String images) { 
 this.images = images; 
 } 
 
 public double getPrice() { 
 return price; 
 } 
 
 public void setPrice(double price) { 
 this.price = price; 
 } 
 
 public int getNum() { 
 return num; 
 } 
 
 public void setNum(int num) { 
 this.num = num; 
 } 
 
 public boolean isChildCb() { 
 return childCb; 
 } 
 
 public void setChildCb(boolean childCb) { 
 this.childCb = childCb; 
 } 
 
 @Override 
 public String toString() { 
 return "ChildBean{" + 
  "title='" + title + ''' + 
  ", images='" + images + ''' + 
  ", price=" + price + 
  ", num=" + num + 
  ", childCb=" + childCb + 
  ", btn=" + btn + 
  ", pid=" + pid + 
  '}'; 
 } 
} 

4.接口

1.ApiService

package com.bwei.gepeng.http; 
 
 
import com.bwei.gepeng.entity.CartBean; 
import com.bwei.gepeng.entity.GoodsShowBean; 
import com.bwei.gepeng.entity.MessageBean; 
 
import java.util.List; 
import java.util.Map; 
 
import io.reactivex.Flowable; 
import retrofit2.http.GET; 
import retrofit2.http.QueryMap; 
 
public interface ApiService { 
 //查询商品详情75 
 //http://120.27.23.105/product/getProductDetail?pid=75&source=android 
 @GET("product/getProductDetail") 
 Flowable> getNews(@QueryMap Map map); 
 
 //查询购物车 
 //http://120.27.23.105/product/getCarts?uid=3802&source=android 
 @GET("product/getCarts") 
 Flowable>> getCart(@QueryMap Map map); 
 
 
 //删除购物车 
 //http://120.27.23.105/product/getCarts?uid=3802&source=android 
 @GET("product/deleteCart") 
 Flowable>> getDel(@QueryMap Map map); 
 
 //添加购物车 
 //http://120.27.23.105/product/addCart?uid=3802&pid=75&source=android 
 @GET("product/addCart") 
 Flowable>> getAdd(@QueryMap Map map); 
} 
2.IView
[java] view plain copy
public interface IView { 
 void OnSuccess(Object o,String tag); 
 void OnFailed(Exception e,String tag); 
} 
3.IPresenter
[java] view plain copy
import java.util.Map; 
 
public interface IPresenter { 
 void getData(Map map, String tag); 
} 
4.IModel
[java] view plain copy
import java.util.Map; 
 
public interface IModel { 
 void getData(Map map,String tag); 
} 

5.代码

1.自定义View 加减器 AddDeleteView

package com.bwei.gepeng.myview; 
 
import android.content.Context; 
import android.content.res.TypedArray; 
import android.graphics.Color; 
import android.util.AttributeSet; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
 
import com.bwei.gepeng.R; 
 
public class AddDeleteView extends LinearLayout { 
 private OnAddDelClickListener listener; 
 private EditText etNumber; 
 
 //对外提供一个点击的回调接口 
 public interface OnAddDelClickListener{ 
 void onAddClick(View v); 
 void onDelClick(View v); 
 } 
 
 public void setOnAddDelClickListener(OnAddDelClickListener listener){ 
 if(listener!=null){ 
  this.listener=listener; 
 } 
 } 
 
 public AddDeleteView(Context context) { 
 this(context,null); 
 } 
 
 public AddDeleteView(Context context, AttributeSet attrs) { 
 this(context, attrs,0); 
 } 
 
 public AddDeleteView(Context context, AttributeSet attrs, int defStyleAttr) { 
 super(context, attrs, defStyleAttr); 
 initView(context, attrs, defStyleAttr); 
 } 
 
 private void initView(Context context, AttributeSet attrs, int defStyleAttr) { 
 View.inflate(context, R.layout.layout_add_delete,this); 
 
 //获取控件 
 TextView txtDelete=findViewById(R.id.txt_delete); 
 TextView txtAdd=findViewById(R.id.txt_add); 
 etNumber = findViewById(R.id.et_number); 
 
 
 TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AddDeleteViewStyle); 
 
 String leftText = typedArray.getString(R.styleable.AddDeleteViewStyle_left_text); 
 String rightText = typedArray.getString(R.styleable.AddDeleteViewStyle_right_text); 
 String middleText = typedArray.getString(R.styleable.AddDeleteViewStyle_middle_text); 
 int color = typedArray.getColor(R.styleable.AddDeleteViewStyle_left_text_color, Color.RED); 
 
 txtDelete.setText(leftText); 
 txtAdd.setText(rightText); 
 etNumber.setText(middleText); 
 txtDelete.setTextColor(color); 
 
 //回收 
 typedArray.recycle(); 
 
 
 txtDelete.setOnClickListener(new OnClickListener() { 
  @Override 
  public void onClick(View view) { 
  listener.onDelClick(view); 
  } 
 }); 
 
 txtAdd.setOnClickListener(new OnClickListener() { 
  @Override 
  public void onClick(View view) { 
  listener.onAddClick(view); 
  } 
 }); 
 
 } 
 //对外提供一个修改数字的方法 
 public void setNumber(int number){ 
 if(number>0){ 
  etNumber.setText(number+""); 
 } 
 } 
 //对外提供一个获取当前数字的方法 
 public int getNumber(){ 
 String string = etNumber.getText().toString(); 
 int i = Integer.parseInt(string); 
 return i; 
 } 
 
} 

2.Retrofit工具类 RetrofitUtils

package com.bwei.gepeng.http; 
 
import java.io.IOException; 
 
import okhttp3.HttpUrl; 
import okhttp3.Interceptor; 
import okhttp3.OkHttpClient; 
import okhttp3.Request; 
import okhttp3.Response; 
import retrofit2.Retrofit; 
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; 
import retrofit2.converter.gson.GsonConverterFactory; 
 
public class RetrofitUtils { 
 private static volatile RetrofitUtils instance; 
 private final Retrofit retrofit; 
 
 private RetrofitUtils(){ 
 OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new Logger()).build(); 
 
 retrofit = new Retrofit.Builder() 
  .client(client) 
  .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
  .addConverterFactory(GsonConverterFactory.create()) 
  .baseUrl("http://120.27.23.105/") 
  .build(); 
 } 
 
 public static RetrofitUtils getInstance(){ 
 if(instance==null){ 
  synchronized (RetrofitUtils.class){ 
  if(instance==null){ 
   instance=new RetrofitUtils(); 
  } 
  } 
 } 
 return instance; 
 } 
 
 public ApiService getApiService(){ 
 ApiService apiService = retrofit.create(ApiService.class); 
 return apiService; 
 } 
 
 class Logger implements Interceptor { 
 @Override 
 public Response intercept(Chain chain) throws IOException { 
  Request original = chain.request(); 
  HttpUrl url=original.url().newBuilder() 
   .addQueryParameter("source","android") 
   .build(); 
  //添加请求头 
  Request request = original.newBuilder() 
   .url(url) 
   .build(); 
  return chain.proceed(request); 
 } 
 } 
} 

3.M层

package com.bwei.gepeng.model; 
 
import com.bwei.gepeng.entity.CartBean; 
import com.bwei.gepeng.entity.GoodsShowBean; 
import com.bwei.gepeng.entity.MessageBean; 
import com.bwei.gepeng.http.RetrofitUtils; 
import com.bwei.gepeng.presenter.NewsPresenter; 
 
import java.util.List; 
import java.util.Map; 
 
import io.reactivex.Flowable; 
 
public class Model implements IModel{ 
 
 private NewsPresenter presenter; 
 public Model(NewsPresenter presenter) { 
 this.presenter = presenter; 
 } 
 
 @Override 
 public void getData(Map map, String tag) { 
 if(tag.equals("cart")){ 
  Flowable>> flowable = RetrofitUtils.getInstance().getApiService().getCart(map); 
  presenter.get2(flowable,tag); 
 }else if(tag.equals("goods")){ 
  Flowable> flowable = RetrofitUtils.getInstance().getApiService().getNews(map); 
  presenter.get(flowable,tag); 
 }else if(tag.equals("del")){ 
  Flowable>> flowable = RetrofitUtils.getInstance().getApiService().getDel(map); 
  presenter.get3(flowable,tag); 
 }else if(tag.equals("add")){ 
  Flowable>> flowable = RetrofitUtils.getInstance().getApiService().getAdd(map); 
  presenter.get4(flowable,tag); 
 } 
 
 } 
} 

4.P层

package com.bwei.gepeng.presenter; 
 
import com.bwei.gepeng.entity.CartBean; 
import com.bwei.gepeng.entity.GoodsShowBean; 
import com.bwei.gepeng.entity.MessageBean; 
import com.bwei.gepeng.model.Model; 
import com.bwei.gepeng.view.IView; 
 
import java.util.List; 
import java.util.Map; 
 
import io.reactivex.Flowable; 
import io.reactivex.android.schedulers.AndroidSchedulers; 
import io.reactivex.schedulers.Schedulers; 
import io.reactivex.subscribers.DisposableSubscriber; 
 
public class NewsPresenter implements IPresenter{ 
 
 private IView iView; 
 private DisposableSubscriber> subscriber; 
 private DisposableSubscriber>> subscriber2; 
 private DisposableSubscriber>> subscriber3; 
 private DisposableSubscriber>> subscriber4; 
 
 public void attachView(IView iView){ 
 this.iView=iView; 
 } 
 
 @Override 
 public void getData(Map map, String tag) { 
 Model model = new Model(this); 
 model.getData(map,tag); 
 } 
 
 public void detachView(){ 
 if(iView!=null){ 
  iView=null; 
 } 
 if(subscriber!=null){ 
  if(!subscriber.isDisposed()){ 
  subscriber.dispose(); 
  } 
 } 
 if(subscriber2!=null){ 
  if(!subscriber2.isDisposed()){ 
  subscriber2.dispose(); 
  } 
 } 
 if(subscriber3!=null){ 
  if(!subscriber3.isDisposed()){ 
  subscriber3.dispose(); 
  } 
 } 
 if(subscriber4!=null){ 
  if(!subscriber4.isDisposed()){ 
  subscriber4.dispose(); 
  } 
 } 
 } 
 
 //查询购物车 
 public void get(Flowable> flowable , final String tag) { 
 subscriber = flowable.subscribeOn(Schedulers.io()) 
  .observeOn(AndroidSchedulers.mainThread()) 
  .subscribeWith(new DisposableSubscriber>() { 
   @Override 
   public void onNext(MessageBean listMessageBean) { 
   if (listMessageBean != null) { 
    GoodsShowBean data = listMessageBean.getData(); 
    iView.OnSuccess(data,tag); 
   } 
   } 
 
   @Override 
   public void onError(Throwable t) { 
   iView.OnFailed(new Exception(t),tag); 
   } 
 
   @Override 
   public void onComplete() { 
 
   } 
  }); 
 } 
 
 //查询商品详情75 
 public void get2(Flowable>> flowable, final String tag) { 
 subscriber2 = flowable.subscribeOn(Schedulers.io()) 
  .observeOn(AndroidSchedulers.mainThread()) 
  .subscribeWith(new DisposableSubscriber>>() { 
   @Override 
   public void onNext(MessageBean> list) { 
   if (list != null) { 
    List data = list.getData(); 
    if(data!=null){ 
    iView.OnSuccess(data,tag); 
    } 
   } 
   } 
 
   @Override 
   public void onError(Throwable t) { 
   iView.OnFailed(new Exception(t),tag); 
   } 
 
   @Override 
   public void onComplete() { 
 
   } 
  }); 
 } 
 
 //删除购物车 
 public void get3(Flowable>> flowable, final String tag) { 
 subscriber3 = flowable.subscribeOn(Schedulers.io()) 
  .observeOn(AndroidSchedulers.mainThread()) 
  .subscribeWith(new DisposableSubscriber>>() { 
   @Override 
   public void onNext(MessageBean> list) { 
   if (list != null) { 
    String code = list.getMsg(); 
    iView.OnSuccess(code,tag); 
   } 
   } 
 
   @Override 
   public void onError(Throwable t) { 
   iView.OnFailed(new Exception(t),tag); 
   } 
 
   @Override 
   public void onComplete() { 
 
   } 
  }); 
 } 
 
 //添加购物车 
 public void get4(Flowable>> flowable, final String tag) { 
 subscriber4 = flowable.subscribeOn(Schedulers.io()) 
  .observeOn(AndroidSchedulers.mainThread()) 
  .subscribeWith(new DisposableSubscriber>>() { 
   @Override 
   public void onNext(MessageBean> list) { 
   if (list != null) { 
    String code = list.getMsg(); 
    iView.OnSuccess(code,tag); 
   } 
   } 
 
   @Override 
   public void onError(Throwable t) { 
   iView.OnFailed(new Exception(t),tag); 
   } 
 
   @Override 
   public void onComplete() { 
 
   } 
  }); 
 } 
} 

5.MainActivity 商品详情页面

package com.bwei.gepeng.view; 
 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.Toast; 
 
import com.bwei.gepeng.R; 
import com.bwei.gepeng.entity.GoodsShowBean; 
import com.bwei.gepeng.presenter.NewsPresenter; 
import com.facebook.drawee.view.SimpleDraweeView; 
 
import java.util.HashMap; 
import java.util.Map; 
 
import butterknife.BindView; 
import butterknife.ButterKnife; 
import butterknife.OnClick; 
 
public class MainActivity extends AppCompatActivity implements IView { 
 
 @BindView(R.id.my_image_view) 
 SimpleDraweeView myImageView; 
 @BindView(R.id.goods_title) 
 TextView goodsTitle; 
 @BindView(R.id.goods_price) 
 TextView goodsPrice; 
 private NewsPresenter presenter; 
 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_main); 
 ButterKnife.bind(this); 
 
 presenter = new NewsPresenter(); 
 presenter.attachView(this); 
 //http://120.27.23.105/product/getProductDetail?pid=75&source=android 
 Map map = new HashMap<>(); 
 map.put("pid", "75"); 
 presenter.getData(map, "goods"); 
  
 } 
 
 @Override 
 public void OnSuccess(Object o, String tag) { 
 if (tag.equals("goods")) { 
  if (o != null) { 
  GoodsShowBean data = (GoodsShowBean) o; 
  //Log.e("Gp", "OnSuccess: " + data.toString()); 
 
  myImageView.setImageURI(data.getImages().split("\|")[0]); 
  goodsTitle.setText(data.getTitle()); 
  goodsPrice.setText("¥ "+data.getPrice()); 
  } 
 }else if(tag.equals("add")){ 
  if (o != null) { 
  String msg = (String) o; 
  Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); 
  } 
 } 
 } 
 
 @Override 
 public void OnFailed(Exception e, String tag) { 
 
 } 
 
 @OnClick({R.id.btn_addcart, R.id.btn_shopping}) 
 public void onViewClicked(View view) { 
 switch (view.getId()) { 
  case R.id.btn_addcart: 
  Map map = new HashMap<>(); 
  map.put("uid", "3802"); 
  map.put("pid", "75"); 
  presenter.getData(map, "add"); 
  //Toast.makeText(MainActivity.this,"添加成功",Toast.LENGTH_SHORT).show(); 
  break; 
  case R.id.btn_shopping: 
  Intent intent=new Intent(MainActivity.this,Main2Activity.class); 
  startActivity(intent); 
  break; 
 } 
 } 
} 

6.二级列表适配器 ExpandableAdapter

package com.bwei.gepeng.adapter; 
 
import android.content.Context; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseExpandableListAdapter; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.TextView; 
import android.widget.Toast; 
 
import com.bwei.gepeng.R; 
import com.bwei.gepeng.entity.ChildBean; 
import com.bwei.gepeng.entity.GroupBean; 
import com.bwei.gepeng.myview.AddDeleteView; 
import com.bwei.gepeng.view.Main2Activity; 
import com.facebook.drawee.view.SimpleDraweeView; 
 
import java.util.ArrayList; 
import java.util.List; 
 
 
public class ExpandableAdapter extends BaseExpandableListAdapter { 
 private Context context; 
 private List groupBeen=new ArrayList<>(); 
 private List> childBeen=new ArrayList<>(); 
 
 private Main2Activity main; 
 
 public ExpandableAdapter(Context context, List groupBeen, List> childBeen) { 
 this.context = context; 
 this.groupBeen = groupBeen; 
 this.childBeen = childBeen; 
 this.main = (Main2Activity) context; 
 } 
 //接口回调 
 private onDeleteGoods onDleGoods; 
 
 public interface onDeleteGoods{ 
 void onDelGoods(int i,int i1,String pid); 
 } 
 
 public void setOnDeleteGoods(onDeleteGoods onDleGoods){ 
 this.onDleGoods=onDleGoods; 
 } 
 
 @Override 
 public int getGroupCount() { 
 return groupBeen.size(); 
 } 
 
 @Override 
 public int getChildrenCount(int i) { 
 return childBeen.get(i).size(); 
 } 
 
 @Override 
 public Object getGroup(int i) { 
 return groupBeen.get(i).getSellerName(); 
 } 
 
 @Override 
 public Object getChild(int i, int i1) { 
 return childBeen.get(i).get(i1).getTitle(); 
 } 
 
 @Override 
 public long getGroupId(int i) { 
 return i; 
 } 
 
 @Override 
 public long getChildId(int i, int i1) { 
 return i1; 
 } 
 
 @Override 
 public boolean hasStableIds() { 
 return false; 
 } 
 
 //一级组 
 @Override 
 public View getGroupView(final int i, boolean b, View view, ViewGroup viewGroup) { 
 //加载视图 
 view=View.inflate(context, R.layout.ex_group_item ,null); 
 
 final CheckBox groupCb= view.findViewById(R.id.group_checkbox); 
 TextView shopName= view.findViewById(R.id.shop_name); 
 
 
 shopName.setText(groupBeen.get(i).getSellerName()); 
 groupCb.setChecked(groupBeen.get(i).isGropuCb()); 
 
 //组复选按钮 
 groupCb.setOnClickListener(new View.OnClickListener() { 
  @Override 
  public void onClick(View view) { 
  boolean gchecked = groupCb.isChecked(); 
  groupBeen.get(i).setGropuCb(gchecked); 
  //Main2Activity main= (Main2Activity) context; 
  for(GroupBean i: groupBeen){ 
   boolean gropuCb = i.isGropuCb(); 
   if(!gropuCb){ 
   main.allCheckbox.setChecked(false); 
   break; 
   }else{ 
   main.allCheckbox.setChecked(true); 
   } 
  } 
  int size = childBeen.get(i).size(); 
  if(gchecked){ 
   for(int r=0;r i1:childBeen){ 
   for(int r=0;r

7.购物车页面逻辑 Main2Activity

package com.bwei.gepeng.view; 
 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.CheckBox; 
import android.widget.ExpandableListView; 
import android.widget.TextView; 
 
import com.bwei.gepeng.R; 
import com.bwei.gepeng.adapter.ExpandableAdapter; 
import com.bwei.gepeng.entity.CartBean; 
import com.bwei.gepeng.entity.ChildBean; 
import com.bwei.gepeng.entity.GroupBean; 
import com.bwei.gepeng.presenter.NewsPresenter; 
 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
 
import butterknife.BindView; 
import butterknife.ButterKnife; 
import butterknife.OnClick; 
 
public class Main2Activity extends AppCompatActivity implements IView { 
 
 @BindView(R.id.exListView) 
 ExpandableListView exListView; 
 @BindView(R.id.all_chekbox) 
 public CheckBox allCheckbox; 
 @BindView(R.id.total_price) 
 TextView totalPrice; 
 @BindView(R.id.total_number) 
 TextView totalnumber; 
 @BindView(R.id.tv_go_to_pay) 
 TextView tvGoToPay; 
 @BindView(R.id.tv_go_to_del) 
 TextView tvGoToDel; 
 
 private ExpandableAdapter expandableAdapter; 
 
 private boolean flagedit = true; 
 private boolean flagdel = false; 
 
 
 private NewsPresenter presenter; 
 
 List groupBeen = new ArrayList<>(); 
 List> childBeen = new ArrayList<>(); 
 
 int i; 
 int i1; 
 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_main2); 
 ButterKnife.bind(this); 
 
 //获取二级列表适配器 
 expandableAdapter = new ExpandableAdapter(Main2Activity.this, groupBeen, childBeen); 
 exListView.setAdapter(expandableAdapter); 
 
 exListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { 
  @Override 
  public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) { 
  return true; 
  } 
 }); 
 
 
 presenter = new NewsPresenter(); 
 presenter.attachView(this); 
 //http://120.27.23.105/product/getCarts?uid=3802&source=android 
 Map map = new HashMap<>(); 
 map.put("uid", "3802"); 
 presenter.getData(map, "cart"); 
 
 
 expandableAdapter.setOnDeleteGoods(new ExpandableAdapter.onDeleteGoods() { 
  @Override 
  public void onDelGoods(int i, int i1, String pid) { 
  Main2Activity.this.i = i; 
  Main2Activity.this.i1 = i1; 
 
  Map map = new HashMap<>(); 
  map.put("uid", "3802"); 
  map.put("pid", pid); 
  presenter.getData(map, "del"); 
 
  } 
 }); 
 
 } 
 
 
 @Override 
 public void OnSuccess(Object o, String tag) { 
 if (tag.equals("cart")) { 
  if (o != null) { 
  List data = (List) o; 
  for (CartBean i : data) { 
   GroupBean groupBean = new GroupBean(i.getSellerName(), false); 
   this.groupBeen.add(groupBean); 
   List list = i.getList(); 
   List ls = new ArrayList<>(); 
   for (CartBean.ListBean w : list) { 
   String[] split = w.getImages().split("\|"); 
   ChildBean childBean = new ChildBean(w.getTitle(), split[0], w.getPrice(), 1, false, false, w.getPid()); 
   ls.add(childBean); 
   } 
   this.childBeen.add(ls); 
 
  } 
  for (int i = 0; i < expandableAdapter.getGroupCount(); i++) { 
   exListView.expandGroup(i); 
  } 
  } 
 } else if (tag.equals("del")) { 
  if (o != null) { 
  String msg = (String) o; 
 
  if (this.i != -1 && this.i1 != -1) { 
   int size = childBeen.get(i).size(); 
   if (size == 1) { 
   childBeen.remove(i); 
   groupBeen.remove(i); 
   } else { 
   childBeen.get(i).remove(i1); 
   } 
   
   changesum(childBeen); 
 
   this.i = -1; 
   this.i1 = -1; 
   if(flagdel){ 
   delGoods(); 
   } 
  } 
  } 
 } 
 expandableAdapter.notifyDataSetChanged(); 
 } 
 
 @Override 
 public void OnFailed(Exception e, String tag) { 
  
 } 
 
 @OnClick({R.id.back, R.id.edit, R.id.all_chekbox,R.id.tv_go_to_del}) 
 public void onViewClicked(View view) { 
 switch (view.getId()) { 
  case R.id.back: 
  finish(); 
  break; 
  case R.id.edit: 
  if(flagedit){ 
   tvGoToPay.setVisibility(View.GONE); 
   tvGoToDel.setVisibility(View.VISIBLE); 
  }else{ 
   tvGoToPay.setVisibility(View.VISIBLE); 
   tvGoToDel.setVisibility(View.GONE); 
  } 
 
  for (List i1 : childBeen) { 
   for (int r = 0; r < i1.size(); r++) { 
   i1.get(r).setBtn(flagedit); 
   } 
  } 
  flagedit = !flagedit; 
  expandableAdapter.notifyDataSetChanged(); 
  break; 
  case R.id.all_chekbox: 
  boolean checked = allCheckbox.isChecked(); 
  //改变一级item复选框 
  for (GroupBean i : groupBeen) { 
   i.setGropuCb(checked); 
  } 
  //改变二级item复选框 
  for (List i1 : childBeen) { 
   for (int r = 0; r < i1.size(); r++) { 
   i1.get(r).setChildCb(checked); 
   } 
  } 
  expandableAdapter.notifyDataSetChanged(); 
  changesum(childBeen); 
  break; 
  case R.id.tv_go_to_del: 
  if(childBeen.size()!=0){ 
   for (List i1 : childBeen) { 
   for (int r = 0; r < i1.size(); r++) { 
    boolean childCb1 = i1.get(r).isChildCb(); 
    if (childCb1) { 
    flagdel=true; 
    delGoods(); 
    if(allCheckbox.isChecked()){ 
     allCheckbox.setChecked(false); 
    } 
    break; 
    } 
   } 
   if(flagdel){ 
    break; 
   } 
   } 
  } 
  //Toast.makeText(Main2Activity.this,flagdel+"",Toast.LENGTH_SHORT).show(); 
  break; 
 } 
 } 
 
 //递归删除 
 private void delGoods(){ 
 Boolean flag=false; 
 for(int p=0;p map = new HashMap<>(); 
   map.put("uid", "3802"); 
   map.put("pid", pid+""); 
   presenter.getData(map, "del"); 
   flag=!flag; 
   break; 
  } 
  } 
  if(flag){ 
  break; 
  } 
 } 
 } 
 
 //计算和数量总价 
 public void changesum(List> childBeen) { 
 int count = 0; 
 double sum = 0; 
 for (List i1 : childBeen) { 
  for (int r = 0; r < i1.size(); r++) { 
  boolean childCb1 = i1.get(r).isChildCb(); 
  if (childCb1) { 
   double price = i1.get(r).getPrice(); 
   int num = i1.get(r).getNum(); 
   sum += price * num; 
   count++; 
  } 
  } 
 } 
 totalPrice.setText("¥" + sum); 
 totalnumber.setText("共有商品:" + count + "件"); 
 } 
} 

6.附

shape图 edit

 
 
  
  
  
 

Application 初始化Fresco

import android.app.Application; 
import com.facebook.drawee.backends.pipeline.Fresco; 
 
public class App extends Application{ 
 @Override 
 public void onCreate() { 
 super.onCreate(); 
 Fresco.initialize(this); 
 } 
} 

热门栏目