В этой статье разделяет конкретный код корзины для покупок Rxjava Monhavit для ссылки. Конкретный контент заключается в следующем
Изображение воспроизведения:
1. Зависимость
Processor 'com.jakewharton: Butterknife-компилятор: 8.8.1' Compile 'com.jakewharton: Butterknife: 8.8.1' Compile 'com.android.support:Recyclerview-V7:26.0.0-Alpha1' compile 'com.squareup.retrofit2: mrowile: 2.0' compile 'com.squareup.retrofit2: конвертер-GSON: 2.3.0' Compile 'com.facebook.fresco: Fresco: 0.12.0' Compile 'com.facebook.fresco: анимированная база-support: 0.12.0' compilebook.facebook.fresco: animated-webp: 0.12.0 'compile' com.face.ferecpebebook.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: 2.0' 'compile' reactivex.rxjava2: 2.0 '' compile 'reactivex.rxjava2: 2.0' 'compile' reactivex.rxjava2: 2. 'com.squareup.okhttp3: okhttp: 3.9.0' compile 'com.google.code.gson: gson: 2.8.1'
2. макет
1. Дополнительное макет Mayout_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: orentatation = "orever voRoNTAL" HORIZ "oryZONTAL" HORIZ-Ontal "HOREIZ" HORONTAL ". android:weightSum="1"> <TextView android:id="@+id/txt_delete" android:layout_width="30dp" android:layout_height="30dp" android:text="Deduction" 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: Founal = "@Drawable/Edit" Android: Layout_weight = "0.00" Android: Gravity = "center" Android: Text = "1"/> <TextView Android: ID@+ID = TXT/TXT_AD_AD_AD_AD_AD_AD "@+ID/" Android: Layout_width = "30DP" Android: Layout_height = "30DP" Android: Text = "Plus" Android: Gravity = "Center" Android: Founal = "#8B948B"/> </linearlayout>
2. Детали деталей продукта Mayout 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/resa-auto" andloout "http://schemas..com/apk/resa-auto" android " 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_view. Android: layout_width = "match_parent" Android: Layout_height = "450DP" FRESCO: PlaceHOLDERIMAGE = "@MIPMAP/IC_LAUNCHER"/> <TextView Android: ID = "@+ID/GOODATLE_TITLE" Android: Layout_Width = "wroud_content" Android: layout_heuight "roud_content =" roud_content = "roud_content =" roud_content " Android: layout_margin = "10DP" Android: Text = "AAHHH IT YOUR" Android: Textsize = "20DP" /> <TextView Android: ID = "@+ID /GOODE_PRICE" Android: LAYOUT_WIDTH = "roub_content" Android: Layout_Height = "wroud_content" Android: Mayout_margin = "Mayout_Height =" wroud_content ": layout_margin =" layout_height = " Android: Text = "¥ 18132" Android: TextColor = "#dc5f2e" Android: Textsize = "18DP" /> <TextView Android: Layout_Width = "wrap_content" Android: Layout_Height = "wroud_content" Android: Layout_margin = "10DP" Android: TextChant19 "I AMAMANTENTENTENTENTENTENTENTENT" Android: Layout_MARGIN = "10DP": " Android: textsize = "16dp"/> </linearlayout> <linearlayout android: layout_alignparentbottom = "true" Android: layout_width = "match_parent" Android: Layout_height = "50DP" Android: Orientation = "horizontal"> <Tood Android: ID = "@+ID/Btn_Ad_ad Android: Layout_weight = "1" Android: Layout_width = "0DP" Android: Layout_Height = "match_parent" Android: founal = "#ffc207" Android: Text = "Добавить в корзину покупки"/> <button Android: id = "@+id/btn_shopping" Android: layout_weail = "1" Android: Layout_WITHPER ". Android: Mayout_height = "match_parent" Android: founal = "#ff6b06" Android: text = "buy now"/> </linearlayout> </relativeLayout>
3.
<? 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: orevertation = "vertical"-! <Linearlayout android: id = "@+id/top_bar" Android: layout_width = "match_parent" Android: Layout_height = "48dp" Android: Founal = "#f7f7f7" Android: Orientation = "Vertical"> <RelativeLayout Android: Loolout_WIDTH = "MatchErent" Android: LAYOUTIGHTERETIGHT: LAYOUTIGHTERTIGHT: LAYOUTIGHETERTIGHT: LAYOUTIGHTERETIGHT: LAYOUTIGHETERTIGHT: Android: founal = "@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 = "Centre_ Center_AltIcal 'Center Android: padding = "12DP" Android: src = "@Drawable /Back" /> <textView Android: Layout_Width = "match_parent" Android: Mayout_height = "wrap_content" Android: Gravity = "Center" Android: Minheight = "48DP" Android: Texroid = "Android: Android: TextColor =" 1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A "48DP". Android: textsize = "16sp" /> <textView Android: id = "@+id /edit" Android: Layout_width = "wrap_content" Android: Layout_height = "wrap_content" Android: Layout_alignPrentright = "true" Android: Layout_marginright = "40DP": Android: "Android:" Android: Mayroid: mayout_marginright = "40DP": Android ". Android: Text = "Edit" Android: TextColor = "#1A1A1A" Android: TextSize = "14sp" Android: Visibility = "Visible"/> </relativeLayout> </linearlayout> <expandableListView android: id = "@+id/exlistView" Android: layout_width = "Match_parent" match_parent "matchprent" MatchParent Android: layout_height = "0dp" Android: Layout_ween = "1" Android: ChildIndicator = "@null" Android: GroupIndicator = "@null"> </expandableListView> <lineArlayout android: и gravity = "match_parent": layout_height = "50dp" и "gravity =" gravity = "gravity =" gravity = "gravity =" gravity = "gravity 'gravity? Android: Orientation = "horizontal"> <Флажок Android: id = "@+id /all_chekbox" Android: layout_marginleft = "20dp" Android: Layout_width = "wrap_content" Android: Layout_Height = "wrap_content" /> <TextView Android: layout_width = "raw_content" /> <textView: layout_width = " Android: Layout_height = "wrap_content" Android: Text = "Select All"/> <lineArlayout android: id = "@+id/ll_info" Android: Layout_width = "0DP" Android: Layout_Height = "wroud_content" Android: Layout_ween = "4"> <lineaUtout android: wry_content ":" Layout_weem = "4"> <lineaUtout android: "layOutout". Android: Layout_height = "wrap_content" Android: Orientation = "Vertical" Android: Layout_marginright = "20DP" Android: Layout_weew = "1"> <linearlayout android: layout_width = "match_parent" android: layout_height = "wrap_content" android: orever yorizontaly "android" android "android" android "android". <TextView Android: Layout_Width = "wrap_content" Android: Layout_height = "wrap_content" Android: Layout_marginleft = "5DP" Android: Text = "Total:" Android: TextSize = "18sp" Android: TextStyle = "Boldeview" /> <TextView android: id = "@+id /yd /alto_"@+id /yd /ital_ "@+id /"@+id /"@+id /"@+id. Android: layout_width = "wrap_content" Android: layout_height = "wry_content" Android: Text = "¥ 0,00" Android: TextColor = "#F23232" Android: Textsize = "16sp" Android: IDSTYLE = "BIDDER"/> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> Android: layout_width = "match_parent" Android: Layout_height = "wrap_content" Android: Text = "Total Products: 0 части" Android: Gravity = "right" Android: Textsize = "16sp" Android: TextStyle = "bold"/> </linearlayout> <TextView Android: ID = "@+ID/tv_to_to_to_to_to_to_to_to_to_to_to_to Android: layout_width = "match_parent" Android: layout_height = "match_parent" Android: layout_weense = "3" Android: founal = "#fd7a05" Android: Clickable = "true" Android: Gravity = "android: text =" clear "Android: TextColor ="#fafafa " 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="delete" 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: Android: Android: "#cfc3" CFC3 "CFC3"#CFC3 "CFC3" CFC3 "CFC3 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"> <ceplobox Android: ID = "@+ID/Child_checkbox" Android: "Layout"> "Mayout_" Android: layout_marginleft = "20dp" Android: Layout_marginbottom = "50dp" Android: Layout_width = "wrap_content" Android: Layout_Height = "wry_content" /> <RelativeLayout android: layout_marginleft = "20dp" android: layout_widthout: "moolout_marginleft =" 20dp ". Android: layout_height = "match_parent"> <textView Android: id = "@+id/shop_title" Android: layout_width = "wrap_content" Android: layout_height = "wrap_content" Android: "trakout_alignparentleft =" true "Android: Layout_AlignParentArt Android: Mayout_marginleft = "17DP" Android: Layout_MarginStart = "17DP" Android: Text = "TextView" Android: Layout_AlignParentTop = "true" /> <!-<ImageView Android: id = "@+id /shop_img" Android: layout_width = "90DP" Android: LayOute_HEOUTE_HEOUTE_HEOUTE_HEOUTE_HEOUTE_HEOUTE_HEOUTIO Android: Mayout_margintop = "30dp" Приложение: srccompat = "@mipmap/ic_launcher" Android: layout_below = "@+id/shop_name" Android: layout_alignParentleft = "true" Android: Layout_AlignPartStart = "/>> Android: id = "@+id/shop_img" Android: layout_width = "90dp" Android: Layout_height = "90DP" Android: Layout_margintop = "30DP" FRESCO: PlaceholdErimage = "@MIPMAP/IC_LAUNCER" Android: Layout_Below = "@+IDAME/Shop/Shop/Shop/Shop/Shop/Shop/Shop/Shop/Shop/IC_LAUNCHER" Android: Layout_alignParentleft = "true" Android: Layout_alignParentStart = "true"/> <textView Android: id = "@+id/shop_price" Android: Layout_width = "wrap_content" Android: Shop_Height = "wroud_content": layout_aligntop = "@+id/show/shop/show/show/show/show/show/show/show/show/show/show/show/shoт/" rap_content ": layout_aligntop = Android: layout_centerhorizontal = "true" Android: Layout_margintop = "10DP" Android: Text = "¥ 20" Android: TextColor = "#F23232"/> <com.bwei.gepeng.myview.adddeleteview android: id = "@+addrod: android: android: android: nauout_widtheview"@+addroid: " 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" > </comcom.bwei.gepeng.myview.addeleteview> <Кнопка Android: id = "@+id/shop_delete" Android: Layout_width = "wrap_content" Android: Layout_height = "wrap_content" Android: Mayout_AlignParentend = "true" Android: Layout_AlignParent = "rutout_alignparentend =" true ": layout_alignparent =" rutout_alignparentend = "true": layout_alignparent = " Android: Layout_Centervertical = "true" Android: Visibility = "невидимый" Android: Text = "DELETE"/> </RELATIVELAYOUT> </linearlayout>
3. Класс сущности
1
пакет com.bwei.gepeng.entity; Публичный класс BSEANS <T> {Private String Code; частные данные; частная строка 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 * Имя: Торговый Описание 19 * Продукты: 999 * Оценка: 5.0 * Sellerid: 19 */Private Strong Description; частный значок строки; Приватное название строки; частный int productnums; частный двойной счет; Частный int sellerid; public String getDescription () {return description; } public void setDescription (строка описание) {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 (двойная оценка) {this.Score = scord; } public int getSellerId () {return SellerId; } public void setSellerId (int sellerid) {this.sellerid = sellerid; }}}2.
пакет com.bwei.gepeng.entity; Общедоступный класс Goodsshowbean {Private Double BargePrice; частная строка CreateTime; частная строка Defitulurl; частные струнные изображения; private int itemtype; частный int pid; частная двойная цена; частный int pscid; Частный int saleseNum; Частный 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 = detailurl; } public String getImage () {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 (двойная цена) {this.price = цена; } public int getPscid () {return pscid; } public void setPscid (int pscid) {this.pscid = pscid; } public int getSalenum () {return saleseNum; } public void setSAlenum (int saleseNum) {this.salenum = salepenum; } public int getSellerId () {return SellerId; } public void setSellerId (int sellerid) {this.sellerid = sellerid; } public String getSubead () {return subhead; } public void setSubhead (String subhead) {this.subhead = subhead; } public String getTitle () {return title; } public void settitle (строка заголовка) {this.title = title; } @Override public String toString () {return "GoaldShowbean {" + "BargainPrice =" + bargainprice + ", createTime = '" + createTime +'/'' + ", detailUrl = '" + detailUrl +'/'' + ", images = '" +'/'' + ", itempe =" + itempe + ", PIDTPE +", PIDTPE + ", PIDTPE +", PIDTPE + ", PIDTPE +". PRICE = " + цена +", pscid = " + pscid +", salseenum = " + salseenum +", sellerid = " + sellerid +", subhead = "" + subhead + '/' ' + ", title ='" + title + '/' ' +'} '; }}3. Cartbbean
пакет com.bwei.gepeng.entity; импортировать java.util.list; открытый класс Cartbean {Private String Sellername; частная строка Sellerid; Частный список <Listbean> List; public String getsellername () {return sellername; } public void setSellername (String sellername) {this.sellername = sellername; } public String gestellerId () {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 BargePrice; частная строка CreateTime; частная строка Defitulurl; частные струнные изображения; частный int num; частный int pid; частная двойная цена; частный int pscid; частный int выбрал; Частный 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 = detailurl; } public String getImage () {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 (двойная цена) {this.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 getSubead () {return subhead; } public void setSubhead (String subhead) {this.subhead = subhead; } public String getTitle () {return title; } public void settitle (строка заголовка) {this.title = title; }} @Override public String toString () {return "cartbean {" + "sellername = '" + sellername +'/'' + ", sellerid = '" + sellerid +'/'' + ", list =" + list + '}'; }}4. Groupbean
пакет com.bwei.gepeng.entity; открытый класс Groupbean {Private String Sellername; Частный логический Groupucb; Public Groupbean (String Sellername, Boolean Groupucb) {this.sellername = sellername; this.gropucb = 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.gropucb = Gourucb; } @Override public String toString () {return "GroupBean {" + "sellername = '" + sellername +'/'' + ", groupucb =" + Gourcb + '}'; }}5. Килд
пакет com.bwei.gepeng.entity; Открытый класс Childbean {Private String Title; частные струнные изображения; частная двойная цена; частный int num; Частный логический ChildCB; Частный логический BTN; частный int pid; Публичные роды (заголовок строки, струнные изображения, двойная цена, int num, boolean childcb, boolean btn, int pid) {this.title = title; this.images = images; this.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 (строка заголовка) {this.title = title; } public String getImage () {return Images; } public void setimages (String Images) {this.Images = images; } public Double GetPrice () {return Price; } public void setPrice (двойная цена) {this.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 +'/'' + ", image = '" + images +'/'' + ", price =" + price + ", num =" + num + ", childcb =" + childcb + ", btn =" + btn + ", pid =" + pid + "; }}4. Интерфейс
1. Запора
пакет 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; Импорт retief2.http.get; Import retive2.http.QueryMap; Общедоступный интерфейс Apiservice {// Запрос продукт 75 //http://120.27.23.105/product/getproductdetail?pid=75&source=Android @get ("Product/getProductDetaile") Flowable <Сообщение <GoodsShowbean >> GetNews (@QueryMap Map, string>; // Запрос корзины для покупок // http: //120.27.23.105/product/getcarts? Uid = 3802 & source = android @get ("Продукт/getCarts") Flowable <Сообщение <list >>> getCart (@QueryMap Map <String, String> Map); // Удалить корзину для покупок // http: //120.27.23.105/product/getcarts? Uid = 3802 & source = android @get ("продукт/deletecart") Flowable <Сообщение <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 <Сообщение <List <Cartbean >>> getAdd (@QueryMap Map <String> Map); } 2.Iview [java] Просмотр простых Copypublic interface iview {void onSuccess (Object O, String Tag); void onfailed (Exception E, String Tag); } 3.Ipresenter [java] Просмотр простого копирования java.util.map; public interface ipresenter {void getData (map <string, string> map, string tag); } 4.Imodel [java] Просмотр простого копирования java.util.map; публичный интерфейс imodel {void getData (map <string, string> map, string тег); }5. Код
1. Пользовательский просмотр AddDeleteView
пакет com.bwei.gepeng.myview; Import Android.content.context; Импорт android.content.res.typedarray; Импорт Android.graphics.color; Import Android.util.attributeSet; Импорт Android.View.View; Import Android.widget.editText; Import Android.widget.linearlayout; Import Android.widget.textView; Импорт com.bwei.gepeng.r; открытый класс AddDeleteView extends linearlayout {private onadddelclicklister Slieder; Private EditText Etnumber; // Предоставьте интерфейс Click Callback для внешнего использования публичного интерфейса onaddelclicklistener {void onaddclick (view v); void Ondelclick (View V); } public void setOnadddelclicklistener (onaddelclicklister sluster) {if (слушатель! = null) {this.listener = слушатель; }} public addDeleteView (контекст контекста) {this (context, null); } public addDeleteView (контекст контекста, attributeSet attrs) {this (context, attrs, 0); } public addDeleteView (контекст контекста, attributeSet attrs, int defstyleattr) {super (контекст, атрис, defstyleattr); initView (контекст, attrs, defstyleattr); } private void initView (контекст контекста, 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.stylable.addeleteviewstyle); String leftext = typedarray.getString (r.stylable.addeleteviewstyle_left_text); String rightext = typedarray.getstring (r.stylable.addeleteviewstyle_right_text); String middletext = typedarray.getString (r.stylable.addeleteviewstyle_middle_text); int color = typedarray.getcolor (r.stylable.addeleteviewstyle_left_text_color, color.red); txtdelete.settext (левый текст); txtadd.settext (правый текст); etnumber.settext (middletext); txtdelete.settextcolor (цвет); // recycle typedarray.recycle (); txtDelete.setOnClickListener (new OnClickListener () {@Override public void onClick (представление View) {alinger.ondelclick (view);}}); txtadd.setonclicklistener (new onclicklistener () {@override public void onclick (view view) {alinger.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. Модернизация класса
пакет com.bwei.gepeng.http; импортировать java.io.ioexception; импортировать okhttp3.httpurl; импортировать okhttp3.interceptor; импортировать okhttp3.ohttpclient; импортировать okhttp3.request; импортировать OKTTP3.Response; Импорт retief2.retrofit; Import retive2.adapter.rxjava2.rxjava2calladapterFactory; Import retive2.converter.gson.gsonConverterFactory; открытый класс monhofitutils {private static volatile montrofitutils экземпляр; Частный финальный модернизация модернизации; private mrowtitutils () {okhttpclient client = new okhttpclient.builder (). addInterceptor (new logger ()). build (); MORFIT = новый MORFIT.BUILDER (). CLIENT (CLIENT) .ADDCALLADAPTERFACTORY (RXJAVA2CALLADAPTERFACTORY.CREATE ()) .ADDCONVERTERTORY (gsonConverterFactory.Create ()) .baseurl ("htttp://120.27.23.105/"). } public static mrowtitUtils getInstance () {if (exant == null) {synchronized (mrowtitututils.class) {if (exance == null) {ancess = new mrowtitutils (); }}} return Encement; } public apiservice getApiservice () {apiservice apiservice = mrotfit.create (apiservice.class); вернуть апезицию; } класс Logger реализует Interceptor {@Override Public Response Intercept (цепь цепей) Throws IOException {запрос original = chain.request (); Httpurl url = original.url (). Newbuilder () .addqueryparameter («источник», «Android») .build (); // Добавить запрос на заголовок запроса = riginal.newbuilder () .url (url) .build (); return chain.proceed (запрос); }}} 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 Dester; Общественная модель (Newspresenter Dester) {this.presenter = докладчик; } @Override public void getData (map <string, string> map, string tag) {if (tag.equals ("cart")) {flowable <message -bean <list <cartbean >>> Flowable = mrotfitutils.getinstance (). Getapiservice (). GetCart (map); affer.get2 (Flowable, Tag); } else if (tag.equals ("Goald")) {Flowable <MessageBean <GoadsShowbean >> Flowable = MORFITUTILS.GETINSTANCE (). GETAPISERVICE (). GETNEWS (MAP); adver.get (Flowable, Tag); } else if (tag.equals ("del")) {flowable <messagebean <list <cartbean >>> flowable = mrowtiTutils.getInstance (). getApiservice (). getDel (map); adver.get3 (Flowable, Tag); } else if (tag.equals ("add")) {flowable <messagebean <list <cartbean >>> flowable = mrowtiTutils.getInstance (). getApiservice (). getAdd (map); adver.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; Newspresenter публичного класса реализует ipresenter {private iview iview; Private isposablesBscriber <Сообщение <Gobdershowbean >> подписчик; private isposablesubscriber <bessebean <list <Cartbean >>> абонент2; private isposablesubscriber <messagebean <list <cartbean >>> абонент3; private isposablesubscriber <messagebean <list <cartbean >>> абонент4; public void attleview (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 (abscriber! = null) {if (! antize.isdisposed ()) {abpcriber.dispose (); }} if (abscriber2! = null) {if (! abpcriber2.isdisposed ()) {adpcriber2.dispose (); }} if (abscriber3! = null) {if (! abpcriber3.isdisposed ()) {adpcriber3.dispose (); }} if (abscriber4! = null) {if (! abpcriber4.isdisposed ()) {adpcriber4.dispose (); }}} // Запрос корзины для покупок public void get (Flowable <MessageBean <Goodshowbean >> Flowable, окончательная строковая тег) {antipriber = flowable.subscribeon (schedulers.io ()) .observeon (androidschedulers.mainthread () .subscrewith (newos Disposablesbriber <workbeanshawbeanshawbeanSh @Override public void onnext (message -bean <sovershowbean> listmessagebean) {if (listmessagebean! } @Override public void onComplete () {}}); } // Запрос детали продукта75 Public void get2 (Flowable <Сообщение bean <List <Cartbean >>> Flowable, окончательная строковая тег) {abscriber2 = flowable.subscribeon (schedulers.io ()) .observeon (androidschedulers.mainthread ()) .subscribewith (New Disposablesububs @Override public void onnext. } @Override public void onComplete () {}}); } // Удалить корзину покупок public void get3 (Flowable <Сообщение <list <list <cartbean >>> Flowable, окончательная строковая тег) {abpcriber3 = Flowable.subscribeon (schedulers.io ()) .observeon (androidschedulers.mainthread ()) .subscribethith (news isposablesbriber <). @Override public innext (Messagebean <List <Cartbean >> list) {if (list! = Nul }); } // Добавить корзину для покупок public void get4 (Flowable <Сообщение <list <list <cartbean >>> Flowable, конечная строканая тег) {abscriber4 = flowable.subscribeon (schedulers.io ()) .observeon (androidschedulers.mainthread ()) .subscribethith (newSposablesubbribre <shiplebean <). (). ().) .Subscribethith (news Disposablesubbriber <). @Override public innext (Messagebean <List <Cartbean >>> {if (list! }); }} 5. Страница сведений о продукте MainActivity
пакет com.bwei.gepeng.view; Импорт Android.content.Intent; Импорт Android.os.bundle; Импорт Android.support.v7.app.appcompatactivity; Импорт Android.View.View; Import Android.widget.textView; Импорт Android.widget.toast; Импорт com.bwei.gepeng.r; Импорт com.bwei.gepeng.entity.goodsshowbean; Импорт com.bwei.gepeng.presenter.newspresenter; import com.facebook.drawee.view.simpledraweeview; импортировать java.util.hashmap; импортировать java.util.map; Импорт Butterknife.bindview; Импорт ButterKnife.butterKnife; Импорт Butterknife.onclick; открытый класс MainActivity Extends 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 (это); докладчик = новый Newspresenter (); aterser.attachview (это); //http://120.27.23.105/product/getproductdetail?pid=75&source=Android map <string, string> map = new hashmap <> (); map.put ("pid", "75"); affer.getData (карта "товары"); } @Override public void onSuccess (Object O, String Tag) {if (tag.equals ("Goals")) {if (o! = Null) {GoaldShowbean data = (GovelShoWbean) 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. это, 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) {switch.getD ()) {case r.id.Btn_addcart: map <string> string> (string> () newhm; map.put ("uid", "3802"); map.put ("pid", "75"); affer.getData (map, "Add"); //Toast.maketext(mainactivity.this, удачно ", успешно", toast.length_short) .show (); перерыв; case r.id.btn_shopping: intent intent = новое намерение (mainActivity.this, main2activity.class); StartActivity (намерение); перерыв; }}} 6. AdpandableDapter AdvandableAdapter вторичного списка
пакет com.bwei.gepeng.adapter; Import Android.content.context; Импорт Android.View.View; Импорт Android.View.ViewGroup; Import Android.widget.baseexpandableListAdapter; Импорт Android.widget.button; Import Android.widget.checkbox; Import Android.widget.textView; Импорт 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; } //Interface callback 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; } //Level 1 group @Override public View getGroupView(final int i, boolean b, View view, ViewGroup viewGroup) { //Load view 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()); //Group check button 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 groupCb = i.isGropuCb(); if(!groupCb){ 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 button"+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 button"+gchecked+""+size, Toast.LENGTH_SHORT).show(); childBeen.get(i).get(r).setChildCb(false); } } notifyDataSetChanged(); main.changesum(childBeen); } }); return view; } //Second-level group @Override public View getChildView(final int i, final int i1, boolean b, View v, ViewGroup viewGroup) { //Load view 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; //Control the visible and hidden if(childBeen.get(i).get(i1).isBtn()){ shop_delete.setVisibility(View.VISIBLE); }else{ shop_delete.setVisability(View.INVISIBLE); } //Delete button listening shop_delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { onDleGoods.onDelGoods(i,i1,childBeen.get(i).get(i1).getPid()+""); } }); //AddDelClickListener(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,"The minimum number of users is 1",Toast.LENGTH_SHORT).show(); } number--; adv.setNumber(number); childBeen.get(i).get(i1).setNum(number); main.changesum(childBeen); } }); //Checkbox of secondary group listen 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 button"+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 flagdel = 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); //Get the secondary list adapter 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(); перерыв; case R.id.edit: if(flagedit){ tvGoToPay.setVisability(View.GONE); tvGoToDel.setVisability(View.VISIBLE); }else{ tvGoToPay.setVisability(View.VISIBLE); tvGoToDel.setVisability(View.GONE); } for (List<ChildBean> i1 : childBeen) { for (int r = 0; r < i1.size(); r++) { i1.get(r).setBtn(flagedit); } } flagedit = !flagedit; expandableAdapter.notifyDataSetChanged(); перерыв; case R.id.all_chekbox: boolean checked = allCheckbox.isChecked(); //Change the first-level item check box for (GroupBean i : groupBeen) { i.setGropuCb(checked); } //Change the second-level item check box for (List<ChildBean> i1 : childBeen) { for (int r = 0; r < i1.size(); r++) { i1.get(r).setChildCb(checked); } } expandableAdapter.notifyDataSetChanged(); changesum(childBeen); перерыв; 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); } перерыв; } } if(flagdel){ break; } } } //Toast.makeText(Main2Activity.this,flagdel+"",Toast.LENGTH_SHORT).show(); перерыв; } } //Recursively delete 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; перерыв; } } if(flag){ break; } } } //Total price of calculation and quantity public void changesum(List<List<ChildBean>> childBeen) { int count = 0; двойная сумма = 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("Total products:" + count + "piece"); }}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 больше.