この記事では、RXJAVAの特定のコードを共有しています。特定のコンテンツは次のとおりです
複製画像:
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.retrofit2:' compile:compile 'compile' compile 'compile' compile 'compile' compile 'com.squareup.retrofit2:converter-gson:2.3.0'コンパイル 'com.facebook.fresco:fresco:0.12.0'コンパイル 'com.facebook.fresco:Animated-base-support:0.12.0'コンパイル 'com.facebook.fresco:animated-webp:0.12.0'コンピール'com.facebook.fresco:アニメーション-webp:0.12.0'コンパイル 'com.facebook.fresco:webpsupport:0.12.0'コンパイル 'io.reactivex.rxjava2:rxjava:2.1.7'コンパイル 'com.squareup.retrofit2:adapter-r-djava2:' compile 'io.Reactivex.rxjava2:rxandroid:2.0.1'コンパイル 'com.squareup.okhttp3:okhttp:3.9.0'コンパイル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 = "match_parent" android Android:weightsum = "1"> <textView android:id = "@+id/txt_delete" android:layout_width = "30dp" android:layout_height = "30dp" android:text = "desuction" android:gravity = "center" android: Android:id = "@+id/et_number" android:layout_margintop = "2dp" android:layout_width = "50dp" android:layout_height = "30dp" android:background = "@drawable/edit" android:layout_weight = " Android:id = "@+id/txt_add" android:layout_width = "30dp" android:layout_height = "30dp" android:text = "plus" android: "android" android:background = "#8b948b"/> </linearlayout>
2。製品の詳細レイアウトActivity_main
<?xml version = "1.0" encoding = "utf-8"?> <relativelayout xmlns:android = "http://schemas.android.com/apk/res/android" Android:layout_width = "match_parent" android:layout_height = "match_parent"> <lienearlayout android:layout_width = "match_parent" android:layout_height = "match_parent" android:orientation = "vertical"> <com.drawe.simplrawee Android:id = "@+id/my_image_view" android:layout_width = "match_parent" android:layout_height = "450dp" fresco = "@mipmap/ic_launcher"/> <textview android: "@+id/goods_title" Android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_margin = "android:text =" aahhh its yours "android:textsizeize =" 20dp " /> <text android:"@id /goodse_price " Android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_margin = "android:text =" ¥ 18132 "android:textcolor ="#dc5f2e "android:" 18dp " /> < android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_margin = "android:text =" i a a android:textsize = "16dp" />> < /linearrut android:layout_width = "match_parent" android:layout_height = "50dp" android = "horizontal"> <button android:id = "@+id/btn_addcart" android:background = "#ffc207" android:text = "ショッピングカートに追加"/> <ボタンandroid: "@+id/btn_shopping" android:layout_weight = "1" android:layout_width = "0dp" android:layout_heigh "/> </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 = "match_parent" Layout--> <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/透過" android:android = "vertical"> <imageview android: "@+id/back" android:layout_width = "48dp" android:layout_height = " Android:layout_gravity = "center_vertical" android:padding = "12dp" android:src = "@drawable /back" /> <textview android:layout_width = "match_parent" android:layout_height = "wrap_content" android: "center =" android: "android:" " Android:Text = "Shopping Cart" Android:TextColor = "#1A1A1A" Android:TextSize = "16SP" /> <TextView Android: "@+id /Edit" android_width = "wrap_content" android:layout_heigh Android:layout_marginight = "40dp" android:android = "center" android:minheight = "48dp" android:text = "edit" android:textcolor = "#1a1a1a" Android:id = "@+id/exlistview" android:layout_width = "match_parent" android:layout_height = "0dp" android:layout_weight = "1" android:childindicator = "@null" android:groupindicator = "@null" android:layout_width = "match_parent" android:layout_height = "android:ridpity =" center_vertical "android:oterination =" horizontal "> <チェックボックスAndroid:"@+id/all_chekbox "android:layout =" layout = "" android: "android:" android = "android =" android android:layout_height = "wrap_content"/> <textView android:layout_width = "wrap_content" android:layout_height = "wrap_content" android: "all"/> <linearlayout android:id = "@+id/ll_info" "android" 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 = "" android = " <linearlayout android:layout_width = "match_parent" android:layout_height = "wrap_content" android:orientation = "horizontal" android:ravity = "right"> <textview android:layout_width = "wrap_content" android:layout_height = "lap_content" Android:layout_marginleft = "5dp" android:text = "total:" android: "android:" 18sp "android:textStyle =" bold " /> <textView android:id ="@+id /total_price "android:layout_width =" wrap_content "rayout_height" "" Android:text = "¥0.00" android:textcolor = "#f23232" android:textsize = "16sp" android:textStyle = "bold"/> </linearlayout> <textView android:id = "@+id/tother_number" Android:layout_height = "wrap_content" android:text = "total froction:0 fiece" android:right = "right" android: "16Sp" android: "bold"/> </linearlayout> <textview android:id = "@+id/id/tv_go_go_to_pay" android " android:layout_height = "match_parent" android:layout_weight = "3" android:background = "#fd7a05" android:clickable = "true" android: "android" android:text = "clear" android:textcolor = " android:layout_width = "match_parent" android:layout_height = "match_parent" android:layout_weight = "3" android:background = "#e2231c" android: "true" android:ravity = "center" android: "delete" delete " /> </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_heigh Android:Orientation = "Horizontal"> <チェックボックスAndroid:Id = "@+id/group_checkbox" android:layout_marginleft = "20dp" android:layout_width = "wrap_content" android:layout_height = "wrap_content" Android:id = "@+id/shop_name" android:layout_marginleft = "20dp" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:textsize = "16dp"/> </linearlayout>
5。セカンダリリストsub-layout 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"> <チェックボックス: " android:layout_margintop = "50dp" android:layout_marginleft = "20dp" android:layout_marginbottom = "android:layout_width =" wrap_content "android:layout_height =" wrap_content " /> <relativeLayout android android =" "20dma android:layout_width = "match_parent" android:layout_height = "match_parent"> <textView android: "@+id/shop_title" android:layout_width = "wrap_content" android:layout_height = "rap_content" androign_alignignignignignignignignignight_content " android:layout_alignparentstart = "true" android:layout_marginleft = "17dp" android:layout_marginstart = "17dp" android: "text =" textview "android:layout_alignparenttop =" true " /> <! 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_width = "90dp" android:layout_height = "90dp" android_margintop "" fresco:placeholderimage = "@mipmap/ic_launcher" android:layout_below = "@+id/shop_name" android:layout_alignparentleft = "true" android:layout_alignparentstart = "true"/> <text 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:" Android:textcolor = "#f23232"/> <com.bwei.gepeng.myview.adddeleteview android:id = "@+id/adv" android:layout_width = "160dp" android:layout_height = "30dp" android:layout_below = "@+id/+id/shop" Android:layout_margintop = "30dp" android:layout_marginleft = "140dp" app:left_text = " - " app:right_text = "+" app:middle_text = "1" android:focusable = "fals"> </com.bwei.gepeng.myview.addeleteview> <botn Android:id = "@+id/shop_delete" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_alignparentend = "true" android:layout_alignparentright = "android:layout_centertical =" android "android" Android:text = "Delete"/> </relativelayout> </linearlayout>
3。エンティティクラス
1。MessageBean
パッケージcom.bwei.gepeng.entity; public class messagebean <t> {private string code;プライベートTデータ;プライベート文字列MSG;プライベートセラーズセラー; 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 {/** *説明:私は販売者です19 *アイコン:http://120.27.23.105/images/icon.png * name:merchant 19 * productnums:999 * score:5.0 * sellerid:19 */private string description;プライベート文字列アイコン。プライベート文字列名; Private int ProductNums;プライベートダブルスコア。 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 grotsnums; } 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
パッケージcom.bwei.gepeng.entity; Public Class GoodsShowbean {プライベートダブルバーゲンプリス;プライベート文字列createTime; Private String dericaturerl;プライベート文字列画像; Private int itemType; private int pid;プライベートダブル価格。 private int pscid; Private int salelsenum; private int sellerid;プライベートストリングサブヘッド。プライベートストリングタイトル。 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 = deculatureurl; } 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(2倍の価格){this.price = price; } public int getPscid(){return pscid; } public void setPscid(int pscid){this.pscid = pscid; } public int getSalenum(){return salelenum; } public void setsalenum(int salesenum){this.salenum = salesenum; } 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 = '" + defationurl +'/'' + "、images = '" +' + '' + "価格= " +価格 +"、pscid = " + pscid +"、salesenum = " + salesenum +"、sellerid = " + sellerid +"、subhead = '" + subhead +'/'' +"、title = '" +'/'' + '}'; }}3。cartbean
パッケージcom.bwei.gepeng.entity; java.util.listをインポートします。 public class cartbean {private string sellername; Private String sellerid;プライベートリスト<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;プライベート文字列createTime; Private String dericaturerl;プライベート文字列画像; private int num; private int pid;プライベートダブル価格。 private int pscid; Private int Selected; private int sellerid;プライベートストリングサブヘッド。プライベートストリングタイトル。 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 = deculatureurl; } 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(2倍の価格){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 getSelerid(){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
パッケージcom.bwei.gepeng.entity; public class GroupBean {private String sellername;プライベートブールグループ。 Public GroupBean(String SellerName、Boolean GroupUcb){this.sellername = sellername; this.glopucb = groupucb; } public string getSellername(){return sellername; } public void setsellername(string sellername){this.sellername = sellername; } public boolean isgropucb(){return groupucb; } public void setgropucb(boolean groupucb){this.glopucb = groupucb; } @Override public String toString(){return "groupBean {" + "sellername = '" + sellername +'/'' + "、groupucb =" + groupucb + '}'; }}5.ChildBean
パッケージcom.bwei.gepeng.entity;パブリッククラスのChildbean {private string title;プライベート文字列画像;プライベートダブル価格。 private int num;プライベートブール保育;プライベートブール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(2倍の価格){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 = '" +' + ' + "、price =" + price + "、num =" + num + "、childcb =" + childcb + "、btn =" + btn + " }}4。インターフェイス
1.Apiservice
パッケージcom.bwei.gepeng.http; com.bwei.gepeng.entity.cartbeanをインポートします。 com.bwei.gepeng.entity.goodsshowbeanをインポートします。 com.bwei.gepeng.entity.messagebeanをインポートします。 java.util.listをインポートします。 java.util.mapをインポートします。 Io.Reactivex.Flowableをインポートします。 import retive2.http.get; import retive2.http.QueryMap;パブリックインターフェイスApiservice {//クエリ製品の詳細75 //http://120.27.23.105/getProductdetail?pid=75&source=Android @get( "Product/getProductDetail")Flowable <Messainbean <foochebean>> getnews(@querymap < //クエリショッピングカート// http://120.27.23.105/product/getcarts?uid = 3802&source = android @get( "product/getcarts")flowable <bessawbean <list <cartbean >>> getcart(@querymap map <string> map> map>); //ショッピングカートの削除// http://120.27.23.105/product/getcarts?uid = 3802&source = android @get( "product/deletecart")flowable <bessawbean <list <cartbean >>> getdel(@querymap map <string> map> map>); //ショッピングカートを追加// http://120.27.23.105/product/addcart?uid?uid = 3802&pid = 75&source = android @get( "product/addcart")流量} 2.iview [java] Plain Copypublic Interface iviewを表示{void onsuccess(object o、string tag); boid onfailed(例外E、文字列タグ); } 3.Ipresenter [Java] Plain Copyimport Java.util.mapを表示public Interface ipresenter {void getData(map <string、string> map、string tag); } 4.Imodel [Java] Plain Copyimport Java.util.map; public interface imodel {void getData(Map <String、String> Map、String Tag); }5。コード
1.カスタムビューAddEleteview
パッケージcom.bwei.gepeng.myview; Android.content.contextをインポートします。 Android.content.res.typedArrayをインポートします。 Android.graphics.colorをインポートします。 Android.util.attributesetをインポートします。 Android.view.viewをインポートします。 Android.widget.edittextをインポートします。 Android.widget.linearlayoutをインポートします。 Android.widget.TextViewをインポートします。 com.bwei.gepeng.rをインポートします。 Public Class AddDeleteviewはLinearLayoutを拡張します{private onaddelclicklistenerリスナー。 Private Edittext etnumber; //外部使用のためのクリックコールバックインターフェイスを提供するパブリックインターフェイスonaddelclicklistener {void onaddclick(View v); void ondelclick(view v); } public void setonadddelclicklistener(onaddelclicklistenerリスナー){if(ristener!= null){this.listener = listener; }} public addDeleteview(コンテキストコンテキスト){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(コンテキスト、attrs、defstyleattr); } private void initView(Context Context、Attributeset attrs、int defstyleattr){view.inflate(context、r.layout.layout_add_delete、this); //コントロールを取得するtxtView 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.addeleteviewstyle); string lefttext = typedarray.getString(r.styleable.addeleteviewstyle_left_text); string righttext = typedarray.getString(r.styleable.addeleteviewstyle_right_text); string middletext = typedarray.getString(r.styleable.addeleteviewstyle_middle_text); int color = typedArray.getColor(R.Styleable.AddeleteviewStyle_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){ristener.ondelclick(View);}}); txtadd.setonclickListener(new onclickListener(){@Override public void onclick(View View){ristener.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);私を返します。 }} 2。ToolClass Retrofitutils
パッケージcom.bwei.gepeng.http; java.io.ioexceptionをインポートします。 Import okhttp3.httpurl; Import okhttp3.interceptor; Import okhttp3.okhttpclient; import okhttp3.request; Import okhttp3.response; import treave2.retrofit; import treave2.adapter.rxjava2.rxjava2calladapterfactory; import retive2.converter.gson.gsonConverterFactory; public class retofitutils {private static volatile retofitutilsインスタンス;プライベートファイナルレトロフィットレトロフィット。 private retrofitutils(){okhttpclient client = new okhttpclient.builder()。addInterceptor(new logger())。build(); RETROFIT = new Retrofit.Builder()。クライアント(クライアント).AddcalladapterFactory(rxjava2calladapterfactory.create()).addconverterfactory(gsonconverterfactory.create().baseurl( "http://20.27.23.105/").build().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); Apiserviceを返します。 } class LoggerはInterceptorを実装します{@Override public Response Intercept(チェーンチェーン)スローioException {request original = chain.request(); httpurl url = original.url()。newbuilder().addqueryparameter( "source"、 "android").build(); //リクエストヘッダー要求要求= original.newbuilder().url(url).build(); Return Chain.proceed(request); }}} 3.Mレイヤー
パッケージcom.bwei.gepeng.model; com.bwei.gepeng.entity.cartbeanをインポートします。 com.bwei.gepeng.entity.goodsshowbeanをインポートします。 com.bwei.gepeng.entity.messagebeanをインポートします。 com.bwei.gepeng.http.retrofitutilsをインポートします。 com.bwei.gepeng.presenter.newspresenterをインポートします。 java.util.listをインポートします。 java.util.mapをインポートします。 Io.Reactivex.Flowableをインポートします。パブリッククラスモデルはimodelを実装しています{private Newspresenterプレゼンター。パブリックモデル(NEWSPRESENTERプレゼンター){this.presenter = presenter; } @Override public void getData(map <string、string> map、string tag){if(tag.equals( "cart")){flowable <messagebean >>> flowable = retrofitutils.getinstance()。getCart()。 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レイヤー
パッケージcom.bwei.gepeng.presenter; com.bwei.gepeng.entity.cartbeanをインポートします。 com.bwei.gepeng.entity.goodsshowbeanをインポートします。 com.bwei.gepeng.entity.messagebeanをインポートします。 com.bwei.gepeng.model.modelをインポートします。 com.bwei.gepeng.view.iviewをインポートします。 java.util.listをインポートします。 java.util.mapをインポートします。 Io.Reactivex.Flowableをインポートします。 Io.Reactivex.android.schedulers.androidschedulersをインポートします。 Io.Reactivex.schedulers.schedulersをインポートします。 io.reactivex.subscribers.disposablesubscriberをインポートします。パブリッククラスの新聞からIpresenterを実装します{private iview iview; private dassablesubscriber <messagebean <goodsshowbean >> subscriber; private dassablesubscriber <messagebean <list <cartbean >>> subscriber2; private dassablesubscriber <messagebean <list <cartbean >>> subscriber3; private dassablesubscriber <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(マップ、タグ); } 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(); }}} //クエリショッピングカートパブリックボイドget(flowable <messagebean <goodsshowbean >> flowable、final string tag){subscriber = flowable.subscribeon(schedulers.io()).observeon(androidschedulers.mainthread().subscribewith(new diableablebriber <goodicbean> @Override public void onnext(messagebean <goodsshowean> listmessagebean)例外(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()).subscriber(>>>>>>>>>> lisablibribriber() @Override public onnext(messagebean <list <cartbean >>> list){list!= null){list <cartbean> data = list.getData()例外(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().subscribeith(new disablesubscriber <persambean> < @Override void onnext(messagebean <cartbean >> list){list!= null){list.getmsg(); }}); } //ショッピングカートの追加void get4(flowable <messagebean <list <cartbean >>> flowable、final string tag){subscriber4 = flowable.subscribeon(schedulers.io()).observeon(androidschedulers.mainthread()).subscribeith(new sufterbriber <cartbean public boid onnext(list <cartbean >>> if(list!= null){string code = list.getmsg(); }); }} 5. MainActivity製品の詳細ページ
パッケージcom.bwei.gepeng.view; Android.content.intentをインポート; Android.os.bundleをインポートします。 Android.support.v7.app.appcompatactivityをインポートします。 Android.view.viewをインポートします。 Android.widget.TextViewをインポートします。 Android.widget.toastをインポートします。 com.bwei.gepeng.rをインポートします。 com.bwei.gepeng.entity.goodsshowbeanをインポートします。 com.bwei.gepeng.presenter.newspresenterをインポートします。 com.facebook.drawee.view.simpledraweeviewをインポートします。 java.util.hashmapをインポートします。 java.util.mapをインポートします。 Import butterknife.bindview; Import ButterKnife.ButterKnife; Import butterknife.onclick;パブリッククラスのMainActivityは、AppCompatactivityを拡張しますiview {@bindview(r.id.my_image_view)simpledraweeview myimageview; @bindview(r.id.goods_title)textview goodstitle; @bindview(r.id.goods_price)textview goodsprice;プライベート新聞登録者のプレゼンター。 @Override Protected void oncreate(bundle savedinstancestate){super.oncreate(savedinstancestate); setContentView(r.layout.activity_main); butterknife.bind(this);プレゼンター= 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.put( "uid"、 "3802"); map.put( "pid"、 "75"); presenter.getData(Map、 "add"); //toast.maketext(mainactivity.this、 "添加成功"、toast.length_short).show();壊す; case r.id.btn_shopping:Intent Intent = new Intent(mainactivity.this、main2activity.class); StartActivity(意図);壊す; }}} 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); } }上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。