Este artigo compartilha o código específico do carrinho de compras de implementação do RXJava ROTROFIT para referência de todos. O conteúdo específico é o seguinte
Imagem de reprodução:
1. Dependência
AnoTationProcessor 'com.JakeWharton: ButterKnife-Compiler: 8.8.1' compile 'com.jakewharton: ButterKnife: 8.8.1' compile 'com.android.support: RECYCLAREUW-V7:26.0.0-alpha1' Compile 'com.squarefareUP.ret.ret.ret.ret.ret.ret.ret.ret.ret.ret.ret.ret.retr. 'com.squareup.retofit2: conversor-gson: 2.3.0' compile 'com.facebook.fresco: Fresco: 0,12.0' compile 'com.facebook.fresco: animado-Base-suporp: 0.12.0' compile 'com.fresco: animado-webp: 0.12.0' compile 'com.fresco. compile 'com.facebook.fresco: webpsupport: 0.12.0' compilam 'io.reactivex.rxjava2: rxjava: 2.1.7' compile 'com.squareup.retrofit2: Adapter-rxjava2: 2.3.0' compile 'iO.ReAcTaxx.11.1.squareup.ReActtIrCTIr-rxjava2: 2.3.0' Compile 'iO.ReaC 'com.squareup.okhttp3: okhttp: 3.9.0' compile 'com.google.code.gson: gson: 2.8.1'
2. Layout
1. Layout do adtorado Layout_ADD_DELETE
<? xml versão = "1.0" coding = "utf-8"?> <linearlayout xmlns: Android = "http://schemas.android.com/apk/res/android" Android: layout_width = "match_parent" android: layout_heast_height = " Android: Weightsum = "1"> <TextView Android: id = "@+id/txt_delete" Android: layout_width = "30dp" Android: layout_Height = "30DP" Android: Text = "Deduction" Android: gravidade = "Centro" Android: Android = 8b948484848480: 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 = "Plus" Android: Gravity = "Centre"
2. Detalhes do produto Atividade de layout_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/bods_t/bods_t_t_lancher "/> <TextView Android: id =" "+id/bods_t/bods_t/" Android: layout_height = "wrap_content" Android: layout_margin = "10dp" Android: text = "aahhh é seu" Android: textsize = "20dp" /> <textView Android: id = "@+id /bens_price" Android: layout_widthth = "wront ="@+id /bens_price "Android: layout_widthth =" Android: layout_height = "wrap_content" Android: layout_margin = "10dp" Android: text = "¥ 18132" Android: textColor = "#dc5f2e" Android: textSize = "18DP" /> <ExtView Android: layout_widthth " Android: layout_height = "wrap_content" Android: layout_margin = "10dp" Android: text = "eu sou um comerciante19" Android: textSize = "16dp" /> < /linearLayout> <linearLayout: layout_alignPartTomBotomTom = " Android: Layout_Height = "50DP" Android: Orientation = "Horizontal"> <Button Android: id = "@+id/btn_addcart" Android: layout_weight = "1" Android: layout_width = "0dp" Android: Layout_Heix = "" Android: text = "Adicione ao carrinho de compras"/> <Button Android: id = "@+id/btn_shopping" Android: layout_weight = "1" Android: layout_width = "0dp" Android: layout_Height = "Match_Parent" Android: Bordado = "#F6b06" e "Match_parent" Android: Android: "#ff6b06 e </lativeLayout>
3. Atividade do layout do carrinho de compras_main2
<? xml versão = "1.0" coding = "utf-8"?> <linearlayout xmlns: Android = "http://schemas.android.com/apk/res/android" Android: layout_width = "match_parent" android: layout_height_height = " Layout-> <linearLayout Android: id = "@+id/top_bar" Android: layout_width = "match_parent" Android: Layout_Height = "48DP" Android: Background = "#f7f7f7" Android: Orientation = "Vertical" "> <ATAYOUTAYOUTADRODROIDRODROIDRODRODRODRODRODRODRODRODRODRODRODRODRODRODRODRODRODRODRODRODRODRODRODRODRODRODRODRODRODROIDROTRAIDO) Android: Layout_Height = "48dp" Android: Background = "@Android: Color/Transparent" Android: Orientation = "Vertical"> <ImageView Android: id = "@+id/back" Android: Layout_width = "48DP" Android: Layout_Height = "48DPUNDP" e "48DP" Android: Layout_Height = "48Dpus" e " 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="Shopping Cart" Android: textColor = "#1A1A1A" Android: textsize = "16SP" /> <TextView Android: id = "@+id /edit" Android: layout_width = "wrap_content" Android: layout_height = "wrap_content" Android: Layount " Android: Layout_Marginright = "40dp" Android: Gravity = "Center" Android: Minheight = "48dp" Android: text = "Edit" Android: textColor = "#1a1a1a" Android: textsize = "14Sp" Android: Visibility = "Visible"/Visível "/ 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="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 = "Select All"/> <linearLayout: Android: id = "@+id/ll_info" 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: Android: layout_marginleft = "5dp" Android: text = "Total:" Android: textsize = "18sp" Android: textStyle = "Bold" /> <TextView Android: id = "@+id /total_price" Android: layout_width = "wr_content" Android "" Android: text = "¥ 0,00" Android: textColor = "#f23232" Android: textsize = "16sp" Android: textStyle = "Bold"/> </linearLayout> <TextView Android: Id = "@Id/total_number" Android: Layout_widthth = " Android: layout_height = "wrap_content" Android: text = "Total Products: 0 Pieces" Android: Gravity = "Right" Android: textsize = "16SP" Android: textStyle = "Bold"/> </linearlayout> <TextView Android: id = "@+/tvy_goy_goy_goy_gon" "</linearlayout> <textview Android: id ="@+/tvy_goy_goy_goy "" Android: Layout_Height = "Match_Parent" Android: layout_weight = "3" Android: Background = "#fd7a05" Android: clickable = "true" Android: Gravity = "Centro" Android: Text = "Clear" Andro: textColor = "#fafaFa" /> <TextView Andro "Andro" Android: TEXTCOLOR = "#FAFAFA" /> Android: layout_width = "match_parent" Android: layout_height = "match_parent" Android: layout_weight = "3" Android: background = "#e2231c" Android: clickable = "true" Andro: gravura = "" Android: Text = "DeLeTer: Android =" True ": /> </linearlayout> </linearlayout> </leinearlayout>
4. Layout de nível de grupo secundário Ex_Group_item
<? xml versão = "1.0" coding = "utf-8"?> <linearlayout xmlns: Android = "http://schemas.android.com/apk/res/android" Android: layout_width = "match_parent" android: layout_height = "" Android: Orientation = "Horizontal"> <Caixa de seleção 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"
5. Lista secundária sub-layout ex_child_item
<? xml versão = "1.0" coding = "utf-8"?> <linearlayout xmlns: Android = "http://schemas.android.com/apk/res/android" xmlns: app = http:/schema.android " xmlns: Fresco = "http://schemas.android.com/apk/res-auto" Android: layout_width = "Match_parent" Android: Layout_Height = "230DP" Andro: Orientation = "Horizontal"> <etBox Android: idroid = "" Android: layout_margintop = "50dp" Android: layout_marginleft = "20dp" Android: layout_marginbottom = "50dp" Android: layout_width = "wrap_content" Andro: Layout_Height = "Wrap_content" /" 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_alignparentstart = "true" Android: layout_marginleft = "17DP" Android: layout_marginartt = "17DP" Android: text = "TextView" Android: Layout_alignParentTop = "" /> <! Android: layout_width = "90dp" Android: layout_height = "90dp" Android: layout_margintop = "30dp" App: srccompat = "@mipmap/ic_lancher" Andro: layout_below = "@+/ShopMap /name Android: layout_alignparentstart = "true" />-> <com.facebook.drawee.view.simpledraweeview Android: id = "@+id /shop_img" Android: layout_width = "90dp" Android: Layout_Height = "90dp" Android = " Fresco: PlaceholderImage = "@mipmap/ic_launcher" Android: layout_below = "@+id/shop_name" Android: layout_alignParentleft = "true" Android: Layout_alignParentstart = "True" <TextView Android: Id = "@ Android: layout_height = "wrap_content" Android: layout_alignntop = "@+id/shop_img" Android: layout_centerhorizontal = "true" Android: Layout_Margintop = "10dp" Android: text = "¥ 20" Andro: textColor = " <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_Marg: App: Layout_MarginLeft = "140DP" App: esquerd_text = "-" App: Right_Text = "+" App: Middle_Text = "1" Android: Focusable = "False"> </com.bwei.gepeng.myview.addleteview> <butroid: id = "" Android: layout_width = "wrap_content" Android: layout_height = "wrap_content" Android: layout_alignParentend = "true" Android: layout_alignParentRright = "True" Android: Layout_CenterTerical = "True" Android: Visibilidade = "Invible" "Invible" "Invible" "Inviber" e "Android: Layout_Centertice =" True "Android: Visibilidade =" Inviber " </linearlayout>
3. Classe de entidade
1. MessageBean
pacote com.bwei.gepeng.entity; classe pública MessageBean <T> {Código de String Private; dados T privados; msg de sequência privada; vendedor de vendedores particulares; public String getCode () {Código de retorno; } public void setCode (código da string) {this.code = code; } public t getData () {retornar dados; } 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; } classe estática pública SellerBean {/** * Descrição: Eu sou um comerciante 19 * Ícone: http://120.27.23.105/images/icon.png * Nome: Merchant 19 * ProductNums: 999 * Pontuação: 5.0 * SellerID: 19 */Private String Descrição; Ícone de String Private; nome de string privado; Produto Int ProductNums; Pontuação dupla privada; Private Int SellerID; public string getDescription () {return description; } public void SetDescription (String description) {this.Description = Descrição; } public string geticon () {return icon; } public void Seticon (Ícone da String) {this.icon = icon; } public string getName () {return name; } public void setName (nome da string) {this.name = name; } public int getProductNums () {return productNums; } public void setProductNums (int productNums) {this.productnums = productNums; } public Double getScore () {Return Score; } public void setScore (pontuação dupla) {this.score = score; } public int getSelerid () {return selllerID; } public void setSellerId (int sellerID) {this.sellerid = SellerID; }}}2.Geodsshowbean
pacote com.bwei.gepeng.entity; classe pública benshowbean {private duplo bargainprice; String privada CreateTime; Private String detalheurl; imagens de string privada; Private Int ItemType; private int pid; preço duplo privado; private int pscid; private Int Salesenum; Private Int SellerID; Subpice de String Private; título de sequência privada; public Double getBarGainPrice () {return bargainprice; } public void setBarGainPrice (duplo bargainprice) {this.BarGainPrice = bargainprice; } public string getCreateTime () {return createTime; } public void setCreateTime (string createTime) {this.createTime = createTime; } public string getDetailurl () {return detalheturl; } public void setDetailurl (string detalheurl) {this.detailurl = detalheurl; } public string getImages () {return Images; } public void setImages (string imagens) {this.images = imagens; } 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 (preço duplo) {this.price = price; } public int getpscid () {return pscid; } public void setpscid (int pScid) {this.pscid = pscid; } public int getSalenum () {return salesenum; } public void SetsalEnum (int vendasenum) {this.salenum = salesenum; } public int getSelerid () {return selllerID; } public void setSellerId (int sellerID) {this.sellerid = SellerID; } public string getsubhead () {return subthhop; } public void setSubhead (String subthead) {this.subhead = subthepta; } public string gettitle () {return título; } public void Settitle (título da string) {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 +", Salesenum = " + Salesenum +", SellerID = " + SellerID +", Subhead = '" + Subhead +'/'' +", Title = '" + Title +'/'' '}; }}3. Cartbean
pacote com.bwei.gepeng.entity; importar java.util.list; classe pública CartBean {private String Sellername; private String SellerID; Lista privada <ListBean> Lista; 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; } list public <listbean> getList () {Lista de retorno; } public void setList (list <listbean> list) {this.list = list; } classe estática pública ListBean {Private Double BargainPrice; String privada CreateTime; Private String detalheurl; imagens de string privada; privado int num; private int pid; preço duplo privado; private int pscid; privado int selecionado; Private Int SellerID; Subpice de String Private; título de sequência privada; public Double getBarGainPrice () {return bargainprice; } public void setBarGainPrice (duplo bargainprice) {this.BarGainPrice = bargainprice; } public string getCreateTime () {return createTime; } public void setCreateTime (string createTime) {this.createTime = createTime; } public string getDetailurl () {return detalheturl; } public void setDetailurl (string detalheurl) {this.detailurl = detalheurl; } public string getImages () {return Images; } public void setImages (string imagens) {this.images = imagens; } 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 (preço duplo) {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 selecionado) {this.Selected = selected; } public int getSelerId () {return sellerID; } public void setSellerId (int sellerID) {this.sellerid = SellerID; } public string getsubhead () {return subthhop; } public void setSubhead (String subthead) {this.subhead = subthepta; } public string gettitle () {return título; } public void Settitle (título da string) {this.title = title; }} @Override public String tostring () {return "CartBean {" + "SellerName = '" + SellerName +'/'' ' + ", SellerID ='" + SellerID + '/' ' + ", List =" List +'}; }}4. GrupoBean
pacote com.bwei.gepeng.entity; classe pública GroupBean {private String SellerName; Grupo Booleano Privado; 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 = groupucb; } @Override public string tostring () {return "groupBean {" + "SellerName = '" + SellerName +'/'' ' + ", groupucb =" + groupucb +'} '; }}5.Childbean
pacote com.bwei.gepeng.entity; classe pública Chrabean {private String title; imagens de string privada; preço duplo privado; privado int num; Private Boolean Childcb; Privado Booleano BTN; private int pid; BRIDBEAN Public (título da string, imagens de string, preço duplo, int num, boolean childcb, boolean btn, int pid) {this.title = title; this.images = imagens; this.price = preço; 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 título; } public void Settitle (título da string) {this.title = title; } public string getImages () {return Images; } public void setImages (string imagens) {this.images = imagens; } public Double getPrice () {Return Price; } public void setPrice (preço duplo) {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 }}4. Interface
1.Apiservice
pacote com.bwei.gepeng.http; importar com.bwei.gepeng.entity.cartbean; importar com.bwei.gepeng.entity.goodsshowbean; importação com.bwei.gepeng.entity.MessageBean; importar java.util.list; importar java.util.map; importar io.reactivex.flowable; importação recuper.http.get; importar recuperar2.http.querymap; interface pública ApiseService {// Detalhes do produto de consulta 75 //http://120.27.23.105/product/getproductDetail?pid=75&source=android @get (product/getProductDetail ") Flowable <sessionBean <msShowBean >> getNews (getProductDetail") <MigessBean <sShowBean >> // Carrinho de compras de consulta // http: //120.27.23.105/product/getcarts? Uid = 3802 & fonte = Android @get ("product/getcarts") Flowable <MessageBean <LIST <CartBean>>> // Exclua carrinho de compras // http: //120.27.23.105/product/getcarts? UID = 3802 & fonte = Android @get ("product/DeLeTecart") Flowable <MessageBean <List <TetBean>>> getdel (@QueryMap map <String, string> map); // Adicione carrinho de compras // http: //120.27.23.105/product/addcart? UID = 3802 & pid = 75 & fonte = Android @get ("Product/addCart") Flowable <MessageBean <List <tistBean>> getadd (@QueryMap map <String); } 2.iview [java] Ver interface copypublic plana IView {void onSuccess (objeto o, tag string); vazio onfailed (Exceção e, tag string); } 3.iPresenter [java] Exibir a planície copyimport java.util.map; interface pública iPresenter {void getData (mapa <string, string> map, string tag); } 4.Imodel [java] Ver Plano copyimport java.util.map; interface pública imodel {void getData (mapa <string, string> mapa, string tag); }5 Código
1. Visualização personalizada AddDeleteView
pacote com.bwei.gepeng.myview; importar android.content.context; importar android.content.res.typedArray; importar Android.graphics.color; importar Android.util.attributeSet; importar Android.View.View; importar Android.widget.edittExt; importar android.widget.linearlayout; importar android.widget.textView; importação com.bwei.gepeng.r; classe pública addDeleteView estende linearlayout {private onadddelclicklistener ouvinte; private EdittExt etnumber; // Forneça uma interface de retorno de chamada de clique para uso externo interface pública onadddelclickListener {void onaddClick (view v); vazio ondelClick (view v); } public void setonadddelClickListener (OnadddelClickListener ouvinte) {if (ouvinte! = null) {this.listener = ouvinte; }} public addDeleteView (contexto de contexto) {this (context, null); } public addDeleteView (contexto de contexto, atributeset attrs) {this (context, attrs, 0); } public addDeleteView (contexto de contexto, atributeset attrs, int defstyleattr) {super (contexto, attrs, defstyleattr); initview (contexto, attrs, defstyleattr); } private void initView (contexto de contexto, atributeset attrs, int defstyleattr) {view.inflate (context, r.layout.layout_add_delete, isso); // obtenha o controle textView txtDelete = findViewById (r.id.txt_delete); TextView txtadd = findViewById (r.id.txt_add); etNumber = findViewById (r.id.et_number); TypedArray typeDArray = context.obtanStyledAttributes (attrs, r.styleable.adddEleteViewStyle); String leftText = typeDArray.getString (r.styleable.addDeleteViewStyle_Left_Text); String RightText = typeDArray.getString (r.styleable.adddDeleteViewstyle_right_text); String middleText = typeDArray.getString (r.styleable.adddDeleteViewstyle_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 (cor); // reciclo typedArray.recycle (); txtDelete.setOnClickListener (new OnClickListener () {@Override public void OnClick (View) {listener.ondelClick (View);}}); txtadd.setOnClickListener (new OnClickListener () {@Override public void OnClick (View) {listener.onaddClick (View);}}); } // Forneça um método externo para modificar os números public void SetNumber (int número) {if (número> 0) {etNumber.settext (número+""); }} // Forneça um método externo para obter o número atual public int getNumber () {string string = etNumber.getText (). Tostring (); int i = Integer.parseint (string); retornar i; }} 2. Retrofitutils de classe de ferramentas de adaptação
pacote com.bwei.gepeng.http; importar java.io.ioException; importar okhttp3.httpurl; importar okhttp3.intercept; importar okhttp3.okhttpclient; importar okhttp3.request; importar okhttp3.Response; importação recuper2.retofit; importação recuper2.adapter.rxjava2.rxjava2CallAdapterFactory; importação recuper2.converter.gson.gsonConverterFactory; classe pública ROTROFITUTILS {private estático volátil retrofitutils instância; Retrofit final privado de retrofit; private retrofitUtils () {okhttpclient client = new okhttpclient.builder (). addIntercept (new logger ()). build (); retrofit = new retrofit.builder (). client (client) .addcalladapterfactory (rxjava2calladapterfactory.create ()) .addConverterFactory (gsonConverterFactory.create ()) .baseurl ("http:/120.27.23.20.20.10). } public static retrofitutils getInstance () {if (instance == null) {synchronized (retrofitUtils.class) {if (instance == null) {instance = new retrofitutils (); }}} retornar a instância; } public Apiservice getApiservice () {ApiseService ApiserService = retrofit.create (Apiservice.class); Retornar Apitorervice; } classe Logger implementa o interceptador {@Override Public Respopt Intercept (cadeia Chain) lança IoException {request original = Chain.Request (); Httpurl url = original.url (). Newbuilder () .addQueryParameter ("fonte", "Android") .build (); // Adicionar solicitação de solicitação de cabeçalho solicitação = original.newbuilder () .url (url) .build (); Chain de retorno.proeced (solicitação); }}} 3.m camada
pacote com.bwei.gepeng.model; importar com.bwei.gepeng.entity.cartbean; importar com.bwei.gepeng.entity.goodsshowbean; importação com.bwei.gepeng.entity.MessageBean; importar com.bwei.gepeng.http.retrofitutils; importar com.bwei.gepeng.presenter.newspresenter; importar java.util.list; importar java.util.map; importar io.reactivex.flowable; A classe pública Model implementa o Imodel {Private NeatSpresenter Apresentador; Modelo público (apresentador do NeatSpresenter) {this.presenter = apresentador; } @Override public void getData (map <string, string> map, string tag) {if (tag.equals ("carrinho")) {fluxo <messageBean <list <TretBean>> flowable = retrofituils.getInstance (). GetApiservice (). GetCart (map); apresentador.get2 (fluxo, tag); } else if (tag.equals ("bens")) {Flowable <MessageBean <Goodsshowbean>> Flowable = retrofitutils.getInstance (). getApiservice (). getNews (map); apresentador.get (fluxo, tag); } else if (tag.equals ("del")) {Flowable <MessageBean <LIST <CARTBEAN>>> Flowable = retrofitutils.getInstance (). getApiservice (). getdel (map); apresentador.get3 (fluxo, tag); } else if (tag.equals ("add")) {fluxo <messageBean <list <TretBean>>> fluxo = retrofitutils.getInstance (). getApiservice (). getadd (map); apresentador.get4 (fluxo, tag); }}} 4.p camada
pacote com.bwei.gepeng.presenter; importar com.bwei.gepeng.entity.cartbean; importar com.bwei.gepeng.entity.goodsshowbean; importação com.bwei.gepeng.entity.MessageBean; importar com.bwei.gepeng.model.model; importar com.bwei.gepeng.view.iview; importar java.util.list; importar java.util.map; importar io.reactivex.flowable; importar io.reactivex.android.schedulers.androidschedulers; importar io.reactivex.schedulers.schedulers; importar io.reactivex.subscripters.disposablesubScruit; public class NeatSpresenter implementa iPresenter {private IView IView; DisposableSableSubscrubr privado <MessageBean <ComshowBean>> Assinante; DisposableSabelsUbring privado <MessageBean <LIST <CARTBEAN>>> assinante2; DisposableSabelsUbring privado <MessageBean <LIST <CARTBEAN>>> assinante3; DisposableSabelsUbring privado <MessageBean <LIST <CARTBEAN>>> assinante4; public void AnextView (IView IView) {this.iview = IView; } @Override public void getData (map <string, string> map, string tag) {modelo model = new Model (this); model.getData (mapa, tag); } public void DetachView () {if (IView! = null) {IView = null; } if (assinante! = null) {if (! subscriter.isdisposed ()) {subscriber.dispose (); }} if (assinante2! = null) {if (! subscriter2.isdisposed ()) {subscriR2.dispose (); }} if (assinante3! = null) {if (! subscriter3.isdisposed ()) {subscriR3.dispose (); }} if (assinante4! = null) {if (! subscriter4.isdisposed ()) {subscrint4.dispose (); }}} // Consulta carrinho de compras public void Get (Flowable <MessageBean <GoodsshowBean>> Flowable, Final String Tag) {subscriter = Flowable.subScribe (Schedulers.io ()) .OBSowSeon (Androidschedulers.MaintHRead () .SubScriBith (New DispestIsBLESSUBLESSUBRERS. @Override Public void onNext (MessageBean <SHOWBEAN> LISTMESSAGEBEAN) {IF (LISTMESSAGEBEAN! = NULL) {BOTSSHOWBEAN DATA = LISTMESSAGEBEAN.GETDATA (); } @Override public void oncomplete () {}}); } // Desenta Detalhes do produto75 public void get2 (Flowable <MessageBean <LIST <LIST <CARTBEAN>>> FLOWABLE, TAG FINAL STRING) {subscriter2 = Flowable.subScribe (SchedulerS.io () .BSoBSeon (Androidschedules.MaintHRead () .SubScritwith (New DisposlsablesTers.MaintHread () .SubScritwith (New DisposlsablesTers.MaintHread () .SubScritwith (New DisposlsAlsTers.MainthRead). @Override public void onNext (MessageBean <List <CartBean >>> LIST) {if (list! } @Override public void oncomplete () {}}); } // Exclua carrinho de compras public void get3 (fluxo <MessageBean <List <TretBean>>> Flowable, Final String Tag) {subscriR3 = Flowable.subScribe (schedulers.io ()) .Observeon (Androidschedulers.MaintHread () .SubScriptEn (despotableSlablessUsBLeScrings.Maints). @Override public void onNext (MessageBean <List <CartBean >> LIST) {if (list! = Null) {string code = list.getmsg (); }); } // Adicione o carrinho de compras public void get4 (fluxo <MessageBean <List <TretBean>>> Flowable, Tag Final String) {subscriR4 = Flowable.subScribeon (Schedulers.io ()) .OBSERVEON (AndroidsChedulers.MaintRead () .SubScriptEn (despotablessUsBLeSbring (NewRoidsBrIrr) (). public void onNext (MessageBean <List <CartBean >>> LIST) {if (list! = null) {string code = list.getmsg (); }} 5. Página de detalhes do produto MainActivity
pacote com.bwei.gepeng.view; importar android.content.intent; importar android.os.bundle; importar android.support.v7.app.appcompatactivity; importar Android.View.View; importar android.widget.textView; importar android.widget.toast; importação com.bwei.gepeng.r; importar com.bwei.gepeng.entity.goodsshowbean; importar com.bwei.gepeng.presenter.newspresenter; import com.facebook.drawee.view.simpledraweeview; importar java.util.hashmap; importar java.util.map; importar butterknife.bindview; importar butterknife.butterknife; importar butterknife.OnClick; classe pública MainActivity estende o appCompatactivity implementa IView {@BindView (r.id.my_image_view) SimpleDraweeview myImageView; @BindView (r.id.goods_title) textView Goodstitle; @BindView (r.id.goods_price) textview bensprice; apresentador de papel de papel privado; @Override Protected void onCreate (pacote savedInstancestate) {super.oCreate (savedInstancestate); setContentView (r.layout.activity_main); Butterknife.bind (isto); apresentador = new NeatSpresenter (); apresentador.attachview (this); //http://120.27.23.105/product/getproductdetail?pid=75&source=android map <string, string> map = new hashmap <> (); map.put ("pid", "75"); apresentador.getData (mapa, "bens"); } @Override public void onSuccess (objeto o, tag de string) {if (tag.equals ("bens")) {if (o! = Null) {bensshowbean data = (bensshowbean) o; //Log.e("gp "," Onsuccess: " + data.toString ()); myImageView.setImageuri (data.getImages (). split ("// |") [0]); goodstitle.settext (data.gettitle ()); bensprice.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 (Exceção e, string tag) {} @onClick ({r.id.btn_addcart, r.id.btn_shopping}) public void unViewClick (exibir) {switch (view.get ()) {case R.id.bt_dcard (exibir) {switch.get.get ()) {Case.Id.bt_adCart (View) {switch.get.get ()) map.put ("uid", "3802"); map.put ("pid", "75"); apresentador.getData (mapa, "add"); //Toast.MakeText(MainActivity.This,"add com sucesso ", Toast.length_short) .show (); quebrar; case r.id.btn_shopping: intenção intenção = nova intenção (mainActivity.This, main2Activity.class); StartActivity (intenção); quebrar; }}} 6. Adaptador da lista secundária ExpandableAdApter
pacote com.bwei.gepeng.adapter; importar android.content.context; importar Android.View.View; importar 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; importar 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; importar java.util.arraylist; importar 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(); quebrar; 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(); quebrar; 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); quebrar; 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); } quebrar; } } if(flagdel){ break; } } } //Toast.makeText(Main2Activity.this,flagdel+"",Toast.LENGTH_SHORT).show(); quebrar; } } //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; quebrar; } } if(flag){ break; } } } //Total price of calculation and quantity 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("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); }}O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.