Rxjava+Retrofit+MVP实现购物车功能
程序员文章站
2023-12-11 17:52:22
本文实例为大家分享了rxjava retrofit实现购物车的具体代码,供大家参考,具体内容如下
效果图:
1.依赖
annotationproces...
本文实例为大家分享了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 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<string,string> map, string tag); } 4.imodel [java] view plain copy import 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); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。