首页 > 编程 > Java > 正文

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

2019-11-26 10:00:34
字体:
来源:转载
供稿:网友

本文实例为大家分享了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

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="horizontal"  android:weightSum="1">   <TextView  android:id="@+id/txt_delete"  android:layout_width="30dp"  android:layout_height="30dp"  android:text="减"  android:gravity="center"  android:background="#8b948b"/>   <EditText  android:id="@+id/et_number"  android:layout_marginTop="2dp"  android:layout_width="50dp"  android:layout_height="30dp"  android:background="@drawable/edit"  android:layout_weight="0.00"  android:gravity="center"  android:text="1"/>  <TextView  android:id="@+id/txt_add"  android:layout_width="30dp"  android:layout_height="30dp"  android:text="加"  android:gravity="center"  android:background="#8b948b"/>   </LinearLayout> 

2. 商品详情布局   activity_main

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:fresco="http://schemas.android.com/apk/res-auto"  android:layout_width="match_parent"  android:layout_height="match_parent">    <LinearLayout  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="vertical">   <com.facebook.drawee.view.SimpleDraweeView   android:id="@+id/my_image_view"   android:layout_width="match_parent"   android:layout_height="450dp"   fresco:placeholderImage="@mipmap/ic_launcher" />   <TextView   android:id="@+id/goods_title"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:layout_margin="10dp"   android:text="a啊啊是你的"   android:textSize="20dp" />   <TextView   android:id="@+id/goods_price"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:layout_margin="10dp"   android:text="¥ 18132"   android:textColor="#dc5f2e"   android:textSize="18dp" />   <TextView   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:layout_margin="10dp"   android:text="我是商家19"   android:textSize="16dp" />    </LinearLayout>   <LinearLayout  android:layout_alignParentBottom="true"  android:layout_width="match_parent"  android:layout_height="50dp"  android:orientation="horizontal">   <Button   android:id="@+id/btn_addcart"   android:layout_weight="1"   android:layout_width="0dp"   android:layout_height="match_parent"   android:background="#ffc207"   android:text="加入购物车"/>   <Button   android:id="@+id/btn_shopping"   android:layout_weight="1"   android:layout_width="0dp"   android:layout_height="match_parent"   android:background="#ff6b06"   android:text="立即购买"/>   </LinearLayout>   </RelativeLayout> 

3.购物车布局 activity_main2

<?xml version="1.0" encoding="utf-8"?> <LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="vertical">   <!--头布局-->  <LinearLayout  android:id="@+id/top_bar"  android:layout_width="match_parent"  android:layout_height="48dp"  android:background="#f7f7f7"  android:orientation="vertical" >   <RelativeLayout   android:layout_width="match_parent"   android:layout_height="48dp"   android:background="@android:color/transparent"   android:orientation="vertical" >    <ImageView   android:id="@+id/back"   android:layout_width="48dp"   android:layout_height="48dp"   android:layout_alignParentLeft="true"   android:layout_gravity="center_vertical"   android:padding="12dp"   android:src="@drawable/back" />    <TextView   android:layout_width="match_parent"   android:layout_height="wrap_content"   android:gravity="center"   android:minHeight="48dp"   android:text="购物车"   android:textColor="#1a1a1a"   android:textSize="16sp" />    <TextView   android:id="@+id/edit"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:layout_alignParentRight="true"   android:layout_marginRight="40dp"   android:gravity="center"   android:minHeight="48dp"   android:text="编辑"   android:textColor="#1a1a1a"   android:textSize="14sp"   android:visibility="visible" />  </RelativeLayout>  </LinearLayout>   <ExpandableListView  android:id="@+id/exListView"  android:layout_width="match_parent"  android:layout_height="0dp"  android:layout_weight="1"  android:childIndicator="@null"  android:groupIndicator="@null" >  </ExpandableListView>   <LinearLayout  android:layout_width="match_parent"  android:layout_height="50dp"  android:gravity="center_vertical"  android:orientation="horizontal" >   <CheckBox   android:id="@+id/all_chekbox"   android:layout_marginLeft="20dp"   android:layout_width="wrap_content"   android:layout_height="wrap_content" />  <TextView   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:text="全选"/>  <LinearLayout   android:id="@+id/ll_info"   android:layout_width="0dp"   android:layout_height="wrap_content"   android:layout_weight="4"   >   <LinearLayout   android:layout_width="match_parent"   android:layout_height="wrap_content"   android:orientation="vertical"   android:layout_marginRight="20dp"   android:layout_weight="1"   >   <LinearLayout    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="horizontal"    android:gravity="right"    >    <TextView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_marginLeft="5dp"    android:text="合计:"    android:textSize="18sp"    android:textStyle="bold" />     <TextView    android:id="@+id/total_price"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="¥0.00"    android:textColor="#f23232"    android:textSize="16sp"    android:textStyle="bold" />   </LinearLayout>   <TextView    android:id="@+id/total_number"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:text="共有商品:0件"    android:gravity="right"    android:textSize="16sp"    android:textStyle="bold" />   </LinearLayout>   <TextView   android:id="@+id/tv_go_to_pay"   android:layout_width="match_parent"   android:layout_height="match_parent"   android:layout_weight="3"   android:background="#fd7a05"   android:clickable="true"   android:gravity="center"   android:text="结算"   android:textColor="#FAFAFA"    />   <TextView   android:id="@+id/tv_go_to_del"   android:layout_width="match_parent"   android:layout_height="match_parent"   android:layout_weight="3"   android:background="#e2231c"   android:clickable="true"   android:gravity="center"   android:text="删除"   android:textColor="#FAFAFA"   android:visibility="gone"   />  </LinearLayout>   </LinearLayout> </LinearLayout> 

4.二级列表组级布局 ex_group_item

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:background="#cfc3c3"  android:orientation="horizontal">   <CheckBox  android:id="@+id/group_checkbox"  android:layout_marginLeft="20dp"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:focusable="false"/>   <TextView  android:id="@+id/shop_name"  android:layout_marginLeft="20dp"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:textSize="16dp" />  </LinearLayout> 

5.二级列表子布局  ex_child_item

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:app="http://schemas.android.com/apk/res-auto"  xmlns:fresco="http://schemas.android.com/apk/res-auto"  android:layout_width="match_parent"  android:layout_height="230dp"  android:orientation="horizontal">   <CheckBox  android:id="@+id/child_checkbox"  android:layout_marginTop="50dp"  android:layout_marginLeft="20dp"  android:layout_marginBottom="50dp"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  />   <RelativeLayout  android:layout_marginLeft="20dp"  android:layout_width="match_parent"  android:layout_height="match_parent">   <TextView   android:id="@+id/shop_title"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:layout_alignParentLeft="true"   android:layout_alignParentStart="true"   android:layout_marginLeft="17dp"   android:layout_marginStart="17dp"   android:text="TextView"   android:layout_alignParentTop="true" />   <!--<ImageView   android:id="@+id/shop_img"   android:layout_width="90dp"   android:layout_height="90dp"   android:layout_marginTop="30dp"   app:srcCompat="@mipmap/ic_launcher"   android:layout_below="@+id/shop_name"   android:layout_alignParentLeft="true"   android:layout_alignParentStart="true" />-->  <com.facebook.drawee.view.SimpleDraweeView   android:id="@+id/shop_img"   android:layout_width="90dp"   android:layout_height="90dp"   android:layout_marginTop="30dp"   fresco:placeholderImage="@mipmap/ic_launcher"   android:layout_below="@+id/shop_name"   android:layout_alignParentLeft="true"   android:layout_alignParentStart="true"   />   <TextView   android:id="@+id/shop_price"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:layout_alignTop="@+id/shop_img"   android:layout_centerHorizontal="true"   android:layout_marginTop="10dp"   android:text="¥20"   android:textColor="#f23232"/>   <com.bwei.gepeng.myview.AddDeleteView   android:id="@+id/adv"   android:layout_width="160dp"   android:layout_height="30dp"   android:layout_below="@+id/shop_price"   android:layout_marginTop="30dp"   android:layout_marginLeft="140dp"   app:left_text="-"   app:right_text="+"   app:middle_text="1"   android:focusable="false"   >  </com.bwei.gepeng.myview.AddDeleteView>   <Button   android:id="@+id/shop_delete"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:layout_alignParentEnd="true"   android:layout_alignParentRight="true"   android:layout_centerVertical="true"   android:visibility="invisible"   android:text="删除" />  </RelativeLayout>   </LinearLayout> 

3.实体类

1. MessageBean

package com.bwei.gepeng.entity;  public class MessageBean <T>{    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<ListBean> 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<ListBean> getList() {  return list;  }   public void setList(List<ListBean> 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<MessageBean<GoodsShowBean>> getNews(@QueryMap Map<String,String> map);   //查询购物车  //http://120.27.23.105/product/getCarts?uid=3802&source=android  @GET("product/getCarts")  Flowable<MessageBean<List<CartBean>>> getCart(@QueryMap Map<String,String> map);    //删除购物车  //http://120.27.23.105/product/getCarts?uid=3802&source=android  @GET("product/deleteCart")  Flowable<MessageBean<List<CartBean>>> getDel(@QueryMap Map<String,String> map);   //添加购物车  //http://120.27.23.105/product/addCart?uid=3802&pid=75&source=android  @GET("product/addCart")  Flowable<MessageBean<List<CartBean>>> getAdd(@QueryMap Map<String,String> map); } 2.IView[java] view plain copypublic interface IView {  void OnSuccess(Object o,String tag);  void OnFailed(Exception e,String tag); } 3.IPresenter[java] view plain copyimport java.util.Map;  public interface IPresenter {  void getData(Map<String,String> map, String tag); } 4.IModel[java] view plain copyimport java.util.Map;  public interface IModel {  void getData(Map<String,String> 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<String, String> map, String tag) {  if(tag.equals("cart")){   Flowable<MessageBean<List<CartBean>>> flowable = RetrofitUtils.getInstance().getApiService().getCart(map);   presenter.get2(flowable,tag);  }else if(tag.equals("goods")){   Flowable<MessageBean<GoodsShowBean>> flowable = RetrofitUtils.getInstance().getApiService().getNews(map);   presenter.get(flowable,tag);  }else if(tag.equals("del")){   Flowable<MessageBean<List<CartBean>>> flowable = RetrofitUtils.getInstance().getApiService().getDel(map);   presenter.get3(flowable,tag);  }else if(tag.equals("add")){   Flowable<MessageBean<List<CartBean>>> 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<MessageBean<GoodsShowBean>> subscriber;  private DisposableSubscriber<MessageBean<List<CartBean>>> subscriber2;  private DisposableSubscriber<MessageBean<List<CartBean>>> subscriber3;  private DisposableSubscriber<MessageBean<List<CartBean>>> subscriber4;   public void attachView(IView iView){  this.iView=iView;  }   @Override  public void getData(Map<String, String> 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<MessageBean<GoodsShowBean>> flowable , final String tag) {  subscriber = flowable.subscribeOn(Schedulers.io())   .observeOn(AndroidSchedulers.mainThread())   .subscribeWith(new DisposableSubscriber<MessageBean<GoodsShowBean>>() {    @Override    public void onNext(MessageBean<GoodsShowBean> 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<MessageBean<List<CartBean>>> flowable, final String tag) {  subscriber2 = flowable.subscribeOn(Schedulers.io())   .observeOn(AndroidSchedulers.mainThread())   .subscribeWith(new DisposableSubscriber<MessageBean<List<CartBean>>>() {    @Override    public void onNext(MessageBean<List<CartBean>> list) {    if (list != null) {     List<CartBean> 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<MessageBean<List<CartBean>>> flowable, final String tag) {  subscriber3 = flowable.subscribeOn(Schedulers.io())   .observeOn(AndroidSchedulers.mainThread())   .subscribeWith(new DisposableSubscriber<MessageBean<List<CartBean>>>() {    @Override    public void onNext(MessageBean<List<CartBean>> 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<MessageBean<List<CartBean>>> flowable, final String tag) {  subscriber4 = flowable.subscribeOn(Schedulers.io())   .observeOn(AndroidSchedulers.mainThread())   .subscribeWith(new DisposableSubscriber<MessageBean<List<CartBean>>>() {    @Override    public void onNext(MessageBean<List<CartBean>> 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<String, String> 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<String, String> 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<GroupBean> groupBeen=new ArrayList<>();  private List<List<ChildBean>> childBeen=new ArrayList<>();   private Main2Activity main;   public ExpandableAdapter(Context context, List<GroupBean> groupBeen, List<List<ChildBean>> 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<size;r++){    //Toast.makeText(context,"group按钮"+ gchecked+""+size, Toast.LENGTH_SHORT).show();    childBeen.get(i).get(r).setChildCb(true);    }   }else{    for(int r=0;r<size;r++){    //Toast.makeText(context,"group按钮"+ gchecked+""+size, Toast.LENGTH_SHORT).show();    childBeen.get(i).get(r).setChildCb(false);    }   }   notifyDataSetChanged();   main.changesum(childBeen);   }  });  return view;  }   //二级组  @Override  public View getChildView(final int i, final int i1, boolean b, View v, ViewGroup viewGroup) {  //加载视图  v=View.inflate(context, R.layout.ex_child_item ,null);   final CheckBox childCb = v.findViewById(R.id.child_checkbox);  TextView shopTitle= v.findViewById(R.id.shop_title);  TextView shopPrice= v.findViewById(R.id.shop_price);  //ImageView shopImg=v.findViewById(R.id.shop_img);  //draweeView.setImageURI(uri);  SimpleDraweeView shopImg = v.findViewById(R.id.shop_img);  final AddDeleteView adv = v.findViewById(R.id.adv);  Button shop_delete=v.findViewById(R.id.shop_delete);   childCb.setChecked(childBeen.get(i).get(i1).isChildCb());  String images = childBeen.get(i).get(i1).getImages();  //Glide.with(context).load(images).into(shopImg);  shopImg.setImageURI(images);  shopTitle.setText(childBeen.get(i).get(i1).getTitle());  shopPrice.setText(childBeen.get(i).get(i1).getPrice()+"");  adv.setNumber(childBeen.get(i).get(i1).getNum());   //final Main2Activity main= (Main2Activity) context;  //控制删除按钮的显隐  if(childBeen.get(i).get(i1).isBtn()){   shop_delete.setVisibility(View.VISIBLE);  }else{   shop_delete.setVisibility(View.INVISIBLE);  }  //删除按钮监听  shop_delete.setOnClickListener(new View.OnClickListener() {   @Override   public void onClick(View view) {    onDleGoods.onDelGoods(i,i1,childBeen.get(i).get(i1).getPid()+"");   }  });   //加减器逻辑  adv.setOnAddDelClickListener(new AddDeleteView.OnAddDelClickListener() {   @Override   public void onAddClick(View v) {   int number = adv.getNumber();   number++;   adv.setNumber(number);   childBeen.get(i).get(i1).setNum(number);   main.changesum(childBeen);   }    @Override   public void onDelClick(View v) {   int number = adv.getNumber();   if(number==1){    Toast.makeText(context,"用户最小数量为1",Toast.LENGTH_SHORT).show();   }   number--;   adv.setNumber(number);   childBeen.get(i).get(i1).setNum(number);   main.changesum(childBeen);   }  });   //二级组的复选框监听  childCb.setOnClickListener(new View.OnClickListener() {   @Override   public void onClick(View view) {   boolean flag=false;   boolean cchecked = childCb.isChecked();   childBeen.get(i).get(i1).setChildCb(cchecked);   //Toast.makeText(context,"child按钮"+ cchecked+""+i1, Toast.LENGTH_SHORT).show();   // Main2Activity main= (Main2Activity) context;   for (List<ChildBean> i1:childBeen){    for(int r=0;r<i1.size();r++) {    boolean childCb1 = i1.get(r).isChildCb();    if(!childCb1){     main.allCheckbox.setChecked(false);     groupBeen.get(i).setGropuCb(false);     flag=true;     break;    }else{     main.allCheckbox.setChecked(true);     groupBeen.get(i).setGropuCb(true);    }    }    if(flag){    break;    }   }    int size = childBeen.get(i).size();   for(int x=0;x<size;x++) {    boolean childCb1 = childBeen.get(i).get(x).isChildCb();    if(!childCb1){    groupBeen.get(i).setGropuCb(false);    break;    }else{    groupBeen.get(i).setGropuCb(true);    }   }   notifyDataSetChanged();   main.changesum(childBeen);   }  });    return v;  }   @Override  public boolean isChildSelectable(int i, int i1) {  return false;  } } 

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<GroupBean> groupBeen = new ArrayList<>();  List<List<ChildBean>> 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<String, String> 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<String, String> 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<CartBean> data = (List<CartBean>) o;   for (CartBean i : data) {    GroupBean groupBean = new GroupBean(i.getSellerName(), false);    this.groupBeen.add(groupBean);    List<CartBean.ListBean> list = i.getList();    List<ChildBean> 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<ChildBean> 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<ChildBean> 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<ChildBean> 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<childBeen.size();p++) {   for (int r = 0; r < childBeen.get(p).size(); r++) {   boolean childCb1 = childBeen.get(p).get(r).isChildCb();   if(p==childBeen.size()-1&&r==childBeen.get(p).size()-1){    flagdel=false;   }   if (childCb1) {    int pid = childBeen.get(p).get(r).getPid();    this.i = p;    this.i1 = r;    Map<String, String> 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<List<ChildBean>> childBeen) {  int count = 0;  double sum = 0;  for (List<ChildBean> 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

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android">  <solid android:color="#FFFFFF" />  <!--<corners android:radius="3dip"/>-->  <stroke  android:width="1dip"  android:color="#BDC7D8" /> </shape> 

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);  } } 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表