この記事では、RXJavaの特定のコードを共有しています。特定のコンテンツは次のとおりです
最初にレンダリングをみんなに見せてください
フレームワーク構造:
1。プロジェクトフレームワーク:MVP、画像の読み込みはFRESCOによって行われます。NetworkリクエストはOKHTTP+RETROFIT(自分でカプセル化、SingleTonモードの追加)を使用して実装されます。
2。ショッピングカートデータの追加を完了します(インターフェイスにデータがない場合は、インターフェイスツールを使用してデータを追加できます)。
3.ビューをカスタマイズして、追加と減算ボタンを実装します。 [追加]をクリックして減算するたびに、アイテムの総数と総価格をそれに応じて変更する必要があります。
4.数量が1の場合、マイナス記号をクリックし、数量は変更されておらず、トーストはユーザーに最小数が1であることをプロンプトします。
5.底部の総数と総価格は、すべてのアイテムの総価格と総数です。各アイテムの数量価格が変更されている場合、下部の総価格の総数をリンクする必要があります。
6.単一選択の機能を実装して、すべてを選択し、デフォルトの選択を初めて入力します。アイテムが選択されていない場合、総数と総価格はボトムデータに含まれません。選択された状態が変更されると、底部の総数と総価格を正しく変更できます。
7. [削除]ボタンをクリックして、アイテムを削除します。下部の総数と総価格は正しく変更でき、インターフェイスデータは削除されます。
必要な依存関係とネットワーキング権限を追加します
コンパイル 'com.squareup.retrofit2:retrofit:2.0.0-beta4' // retrofit2必要なパッケージコンパイル 'com.squareup.retrofit2:converter-gson:2.0.0-beta4' // converterfactoryのgson依存関係パッケージコンパイル 'com.squareup.retrofit2:converter-scalt2:scalter-scalt2:2.0.0.0.0.0.0.文字列依存関係パッケージコンパイル 'io.reactivex.rxjava2:rxjava:2.1.3'compile' io.reactivex.rxjava2:rxandroid:2.0.1'compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'compile 'de.greenrobot:eventbus:3.0.0-beta1'compile' com.facebook.fresco:fresco:0.11.0 '
<outes-permission android:name = "android.permission.internet" />
MVPモードを使用する前の下請け
ネットパッケージ
API
public class api {public static string host = "http://120.27.23.105/product/";}Serviceapi
public interface serviceapi {@get( "getProductDetail")flowable <xqbean> getXQ(@query( "pid")int pid、 @query( "source")string str); @get( "addcart")flowable <AddCart> getMSG(@Query( "uid")int uid、 @query( "pid")int pid、@query( "source")string str); @get( "GetCarts")Flowable <Cartbean> getCart(@Query( "uid")int uid、 @query( "source")string str);}インターフェイスが成功しました
パブリックインターフェイスonnetlisenter <t> {void success(t t);}パッケージを改造します
public class retrofithepler {public static okhttpclient okhttpclient; public Static Serviceapi Serviceapi; / ***優先実行*/ static {getokhttpclient(); } public static okhttpclient gethttpclient(){if(okhttpclient == null){synchronized(okhttpclient.class){if(okhttpclient == null){okhttpclient = new okhttpclient(); }} return okhttpclient; } public static serviceapi getserviceapi(){if(serviceapi == null){synchronized(okhttpclient.class){if(serviceapi == null){serviceapi = oncreate(serviceapi.class、api.host); }}} return serviceapi; } public static <t> t oncreate(class <t> tclass、string url){retrofit retrofit = new retrofit.builder().baseurl(url).addconverterfactory(gsonconverterfactory.create().client(okhttpclient)。 .addcalladapterfactory(rxjava2calladapterfactory.create())//。addcalladapterfactory(rxjava2calladapterfactory.create()).build(); return return.create(tclass); }} Beanパッケージ
詳細については、Beanクラスページ
パブリッククラスxqbean {/** * msg: * seller:{"descripting": "i a merchant 2"、 "アイコン": "http://120.27.23.105/images/icon.png"、 "name": "merchant 2"、 "productnums":999、 "Scare":5、 "sellird":2、 "2 DateRid" {"BargainPrice":111.99、 "CreateTime": "2017-10-14T21:48:08"、 "datioururl": "https://item.m.jd.com/product/4719303.html?utm_source = androidappm_medium = appshare&utm_campaine 335139774&utm_term = qqfriends "、" images ":" https://m.360buyimg.com/n0/jfs/t9004/210/1160 833155/647627/AD6BE059/59B4F4E1N9A2B1532.jpg!Q70.jpg | https://m.360buyimg.com/n0/jfs/t7 504/338/63721388/491286/F5957F53/598E95F1N7F2ADB87.jpg!Q70.jpg | https://m.360buyimg.co M/N0/JFS/T7441/10/64242474/419246/ADB30A7D/598E95FBND989BA0A.jpg!Q70.jpg "、" itemtype ":2 、「PID」:9、「価格」:78.99、「PSCID」:1、「Salenum」:2356、「sellerid」:2、 "Subhead": "すべての中期フェスティバルは簡単ではありません。指 "、"タイトル ":"北京daoxiangcun daoxiangcun mid-autumn festival Mooncake Old Beijing Mooncake Gift Box 655g "} */ private String msg;プライベートセラーズセラー;プライベート文字列コード;プライベートデータビーンデータ。 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 string getCode(){return Code; } public void setCode(string code){this.code = code; } public databean getData(){return data; } public void setdata(databean data){this.data = data; } public static class sellerbean {/** *説明:私は商人2 *アイコンです:http://120.27.23.105/images/icon.png * name:merchant 2 * productnums:999 * score:5.0 * sellerid:2 */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; }} public static class databean { /** * bargainprice:111.99 * createTime:2017-10-14T21:48:08 * dericaturl: https://item.m.jd.com/product/4719303.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=qqfriends *画像: https://m.360buyimg.com/n0/jfs/t9004/210/1160833155/647627/ad6be059/59b4 f4e1n9a2b1532.jpg!q70.jpg | https://m.360buyimg.com/n0/jfs/t7504/338/63721 388/491286/F5957F53/598E95F1N7F2ADB87.jpg!Q70.jpg | https://m.360buyimg.co M/N0/JFS/T7441/10/64242474/419246/ADB30A7D/598E95FBND989BA0A.JPG!Q70.jpg * itemType:2 * PID:9 *価格:78.99 * PSCID:1 *販売:2356 * SellerID:2 * Subhead:すべての中間首相フェスティバルは簡単ではありません。あなたがどこにいても、あなたはあなたの人生をより完全にするために常に一枚のケーキが必要です。 JD Mooncakesはより完全なJD自己操作、稲妻配達、より驚き、指でクリックしてください *タイトル:北京Daoxiangcun Daoxiangcun Mid-Autumn Festival Mooncake Old Beijing Mooncake Gift Box 655g */ Private Double BargainPrice;プライベート文字列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; }}}豆はカートに追加されました
public class addcart {private string msg;プライベート文字列コード; public string getMsg(){return msg; } public void setmsg(string msg){this.msg = msg; } public string getCode(){return Code; } public void setCode(string code){this.code = code; }}製品カテゴリ
パブリッククラスcartbean { /*** msg:request success* code:0* data: [{"list":[{"bargainprice":22.9、 "createTime": "2017-10-14T21:48:08"、 "datiourl": "https://item.jd.com/product/2542855.html? &utm_medium = appshare&utm_campaign = t_335139774&utm_term = qqfriends "、" images ":" https://m.360buyimg.com/n0/jfs/t1930/284/2865629620/390243/e3ade9c4/ 56F0A08FNBD3A1235.JPG!Q70.jpg | https://m.360buyimg.com/n0/jfs/t2137/336/2 802996626/155915/e5e90d7a/56f0a09cn33e01bd0.jpg!q70.jpg | https://m.360buy img.com/n0/jfs/T1882/31/2772215910/389956/C8DBF370/56F0A2NA0C86.JPG !q70.jpg | https://m.360buyimg.com/n0/jfs/t2620/166/2703833710/312660/531a A913/57709035N33857877.jpg!q70.jpg "、" num ":1、" pid ":24、" price ":288、" pscid ":2、" selected ":0、" sellerid ":1、" subhead ": 》 "、"タイトル ":「3つのリスナットローストスナッククリームピーカン225g/bag"}、{"Bargainprice":11800、 "createTime": "33:37"、 "datearurl": "https://item.jd.com.d.com.d.com.d.com.d.com.d.com.d.com .html?utm#_source = androidapp&utm#_medium = appshare&utm#_campaign = t#_335139774&utm#_term = qqfriends "、" images ":" https://m.360buyimg.com/n0/jfs/t6700 /155/2098998076/156185/6CF95035/595DD5A5NC3A7DAB5.jpg pid ":57、" price ":5199、" pscid ":40、" selected ":0、" sellerid ":1、" subhead ":"【i5 MX150 2Gビデオメモリ]フルHD狭いベゼル8Gメモリ256 SSDは、指紋認識プリインストールされたWin10システム」、「タイトル」: "Xiaomi(Mi)Air 13.3インチフルメタル薄いノートブック(I5-7200U 8G 256G 256G PCLE SSD MX150 2G独立グラフィックスFHDフィンガー認識WINTITION WINTITION WINTITION WINTITIONS Silver/r/n "}、{" BargainPrice ":99、" CreateTime ":" 2017-10-14T21:38:26 "、" dericaturl ":" https://item.jd.com/product/4345173.html? Share&UTM#_CAMPAIGN = T#_335139774&utm#_term = qqfriends "、" images ":" https://m.360buyimg .com/n0/jfs/t6037/35/2944615848/95178/6cd6cff0/594a3a10na4ec7f39.jpg!q70.jpg | https: //m.360buyimg.com/n0/jfs/t6607/258/1025744923/75738/DA120A2D/594A3A12NE3E6BC56.jpg! Q70.jpg | https://m.360buyimg.com/n0/jfs/t6370/292/1057025420/64655/F87644E3/594A3A12 n5b900606.jpg!q70.jpg "、" num ":1、" pid ":45、" price ":2999、" pscid ":39、" selected ":0、" sellerid ":" subhead ":" HDデュアルカメラ、パフォーマンスカメラモンスター!」、「タイトル」:「OnePlus Mobile 5(A5000)6GB+64GB Yueyanhui Full Network Connection Dual-Sec Dual Standby Mobile China Unicom Telecom 4G携帯電話 "}]、「Sellername」 1 "、" sellerid ":" 1 "}、{" list ":[{" bargainprice ":6666、" createTime ":" 2017-10-10T16:01:31 "、" datioururl ":" https://item.m.jd.com/product/5089273 .html?utm#_source = androidapp&utm#_medium = appshare&utm#_campaign = t#_335139774&utm#_term = qqfriends "、" images ":" https://m.360buyimg.com/n0/jfs/t8284/363/1326459580/71585/6D3E8013/ 59b857f2n6ca75622.jpg!q70.jpg | https://m.360buyimg.com/n0/jfs/t9346/182/1406837243/28210 6/68AF5B54/59B8480ANE8AF7F5C.JPG!Q70.jpg | https://m.360buyimg.com/n0/jfs/t8434/54/1359766 007/56140/579509d9/59b85801nfea207db.jpg!q70.jpg "、" num ":1、" pid ":46、" "price":234、 "pscid":39、 "selected":0、 "subhead": " different "、" title ":" Apple iPhone 8 Plus(A1864)64GB Golden Mobile Unicom Telecom 4G Mobile "}]、「Sellername": "merchant" 2 "、" sellerid ":" 2 "}、{" list ":[{" bargainprice ":111.99、" createTime ":" 2017-10-03t23:43:53 "、" detailurl ":" https://item.jd.com/product/47193030303.html? utm_medium = appshare&utm_campaign = t_335139774&utm_term = qqfriends "、" images ":" https://m.360buyimg.com /n0/jfs/t9004/210/1160833155/647627/ad6be059/59b4f4e1n9a2b1532.jpg!q70.jpg|https://m.360buyimg.com// N0/JFS/T7504/338/63721388/491286/F5957F53/598E95F1N7F2ADB87.jpg!Q70.jpg | https://m.360buyimg.com/n0 /jfs/t7441/10/64242474/419246/adb30a7d/598e95fbnd989ba0a.jpg!q70.jpg" 「pscid」:1、 "selected":0、 "sellerid":5、 "subhead": "すべての中年のフェスティバルは簡単ではありません。あなたはどこにいても、あなたの人生をより完全にするために常にケーキが必要です。フェスティバルムーンケーキオールドネジムーンケーキギフトボックス655g "}]、" sellername ":" merchant 5 "、" sellerid ":" 5 "}、{" list ":[{" bar gainprice ":11800、" createtime ":" 2017-10-03t23:53:28 "、" datioururl ":" https://mitem.jd.hk/ware/view.act Ion?Wareid = 1988853309&Cachekey = 1ACB07A701ECE8D2434A6AE7FA6870A1 "、" Images ":" https://m.360buyimg.com/ N0/JFS/T6130/97/1370670410/180682/1109582A/593276B1ND81FE723.JPG!Q70.jpg | https://m.360buyimg.com/n 0/jfs/t5698/110/2617517836/202970/c93888888888888888888888888888888FD94EF1F.jpg!Q70.jpg | https://m.360buyimg.com/n0 /jfs/t5698/110/2617517836/202970/c9388888888888888888888888888888888888888D94EF1F.JPG!Q70.jpg|https://.360buyimg.com/n0 /jfs/t5815/178/2614671118/51656/7f52d137/593276c7n107b725a.jpg!q70.jpg|https://.360buyimg.com/n0/j. FS/T5878/60/2557817477/30873/4502B606/593276CAN5A7D6357.jpg!q70.jpg "、" num ":1、" pid ":62、" price ":15999、" pscid ":": "sub:": "": "subs": "subs": "subs": "subs" 1元のオフィス製品と5元の列車のチケットに戻る(返品が終了したら)」、「タイトル」:「新しいアップルモデルのグローバル購入MacBook Pro Apple Laptop Silver VP2 New 13インチバーI5/8G/256G "}]、「Sellername」:「Merchant 6 "、" sellerid ":" 6 "}、{" list ":[{" bargainprice ":399、" createTime ":" 2017-10-03t23:53:28 "、" datioururl ":" https://item.jd.com/product/143982207.html? utm_source = androidapp&utm_medium = appshare&utm_campaign = t_335139774&utm_term = qqfriends " 、「画像」:「https://m.360buyimg.com/n0/jfs/t5887/201/859509257/69994/6bde9bf6/59224c24n e854e14c.jpg!q70.jpg | https://m.360buyimg.com/n0/jfs/t5641/233/853609022/57374/5c73d281 /59224C24N3324D5F4.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5641/233/853609022/5737 4/5C73D281/59224C24N3324D5F4.jpg!q70.jpg "、" num ":1、" pid ":86、" frice ":777、" pscid ":85、" selected ":0、" sellerid ":7、" subhead ":" 2 fort "" "" 2 fute "" "2枚"ストレートズボンタイトジーンズの5袋を簡単に洗う941825ダークグレー33/32(175/84a) "}]、「sellername」:" merchant 7 "、" sellerid ":" 7 "}、{" list ":[{" bargainprice ":111.99、" createTime ":" 2017-10-14T21:39:05 "、" dericeurl ":" https://item.m.jd.com/prod uct/4719303.html?utm_source = androidapp&utm_medium = appshare&utm_campaign = t_335139774&utm_term = qqfriends "、" images ":" https://m.36 0buyimg.com/n0/jfs/t9004/210/1160833155/647627/ad6be059/59b4f4e1n9a2b153 2.jpg!q70.jpg | https://m.360buyimg.com/n0/jfs/t7504/338/63721388/491286/f 5957F53/598E95F1N7F2ADB87.jpg!Q70.jpg | https://m.360buyimg.com/n0/jfs/t74 41/10/64242474/419246/ADB30A7D/598E95FBND989BA0A.jpg!Q70.jpg "、" num ":12、" p ID:1、「価格」:「PSCID」:1、「SellerID」:17、「Subhead」:「あなたがどこにいるかは簡単ではありません。 Daoxiangcun Mid-Autumn Festival Mooncake Old Beijing Mooncake Gift Box 655g "}]、" sellername ":" merchant 17 "、" sellerid ":" 17 "}、{" bargainprice ":111.99、" createTime ":" 2017-10-10-14:05 " ://item.m.jd.com/product/4719303.html?utm_source = androidapp&utm_medium = appshare&utm_campaign = t_335139774&utm_term = qqfriends "、" images ":" https:// m .360buyimg.com/n0/jfs/t9004/210/1160833155/647627/AD6BE059/59B4F4E1N9A2B 1532.jpg!q70.jpg | https://m.360buyimg.com/n0/jfs/t7504/338/63721388/491286 /F5957F53/598E95F1N7F2ADB87.jpg!Q70.jpg|https://m.360buyimg.com/n0/jfs/t 7441/10/64242474/419246/ADB30A7D/598E95FBND989BA0A.jpg!Q70.jpg "、" num ":4、 「PID」:2、「価格」:299、「PSCID」:1、「選択」:0、「SellerID」:18、「Subhead」:「すべての中半のフェスティバルはあなたがどこにいるかは簡単ではありません。 Daoxiang Village Daoxiang Village Mid-Autumn Festival Mooncake Old Beijing Mooncake Gift Box 655g "}]、「Sellername」:" Merchant 18 "、" sellerid ":" 18 "}、{" list ":[{" bargainprice ":11800、" createTime ":" 2017-10-03t23:53:28 "、" derageurl ":" https://mitem.jd.hk/ware /view.action?wareId = 19888853309&cachekey=1Acb07a701ece8d2434a6ae7fa6870a1":"https://m.360buyimg.com/n0/jfs/t6130/97/1 370670410/180682/1109582a/593276b1nd81fe723.jpg!q70.jpg | https://m.360buy img.com/n0/jfs/T5698/110/2617517836/202970/C93888FEB/593276B7NBD94EF1F.JP G!q70.jpg | https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c93 88feb/593276b7nbd94ef1f.jpg!q70.jpg | https://m.360buyimg.com/n0/jfs/t5815/ 178/2614671118/51656/7F52D137/593276C7N107B725A.jpg!Q70.jpg | https://m.36 0buyimg.com/n0/jfs/T5878/60/2557817477/30873/4502B606/593276CAN5A7D6357。 jpg!q70.jpg "、" num ":1、" pid ":76、" price ":37999.99、" pscid ":40、" selected ":0、" sellerid ":20、" subhead ":" 1 Yuan用のコンピューターオフィス製品を購入して、5元のクーポン用クーポンを購入して、列車のチケットを取得します。 VP2 New 13インチバーI5/8G/256G "}]、「SellerName」:「Merchant」 20 "、" sellerid ":" 20 "}、{" list ":[{" bargainprice ":111.99、" createTime ":" 2017-10-14T21:39:05 "、" dericeurl ":" https://item.jd.com/product/471930303.html P&utm_medium = appshare&utm_campaign = t_335139774&utm_term = qqfriends "、" images ":" https://m.360buyimg。 com/n0/jfs/t9004/210/1160833155/647627/ad6be059/59b4f4e1n9a2b1532.jpg!q70.jpg | https://m.360buyimg .com/n0/jfs/t7504/338/63721388/491286/f5957f53/598e95f1n7f2adb87.jpg!q70.jpg | https://m.360buyimg。 com/n0/jfs/t7441/10/64242474/419246/adb30a7d/598e95fbnd989ba0a.jpg!q70.jpg "、" num ":num":1、 "pid":5、 "pric E ":88.99、「pscid」:1、「sellerid」:21、" subhead ":"あなたがどこにいるにしても、あなたの人生をより完全にするためにあなたの人生をより完全にするために、あなたの人生をより完全にします。 Daoxiangcun Mid-Autumn Festival Mooncake Old Beijing Mooncake Gift Box 655g "}]、" sellername ":" merchant 21 "、" sellerid ":" 21 "}] */ private string msg;プライベート文字列コード;プライベートリスト<DataBean>データ; public string getMsg(){return msg; } public void setmsg(string msg){this.msg = msg; } public string getCode(){return Code; } public void setCode(string code){this.code = code; } public List <DataBean> getData(){return data; } public void setData(List <DataBean>データ){this.data = data; } public static class databean { /***リスト: [{"bargainprice":22.9、 "createtime": "2017-10-14T21:48:08"、 "datioururl": "https://item.m.jd.com/product/2542855.html?utm_source = android&utm_med ium = appshare&utm_campaign = t_335139774&utm_term = qqfriends "、" images ":" https://m.360buyimg.com/n0/jfs/t1930/284/2865629620/390243/e3ade9c4/56f0a08 fnbd3a1235.jpg!q70.jpg | https://m.360buyimg.com/n0/jfs/t2137/336/2802996 626/155915/E5E90D7A/56F0A09CN33E01BD0.jpg!Q70.jpg | https://m.360buyimg.c OM/N0/JFS/T1882/31/2772215910/389956/C8DBF370/56F0A0A2NA0C86.JPG!Q70 .jpg | https://m.360buyimg.com/n0/jfs/T2620/166/2703833710/312660/531AA913 /57709035n33857877.jpg!q70.jpg",":1,"pid":24,000,008,000:2,"selected":0,"sellerid":1,"subhead"それは》 "、"タイトル ":「3つのリスナットローストスナッククリームピーカン225g/bag"}、{"Bargainprice":11800、 "CreateTime": ":" 2017-10-10T17:33:37 "、" detailurl ":" https://item.m.d.com.d.com.d.product/438107. tml?utm#_source = androidapp&utm#_medium = appshare&utm#_campaign = t#_335139774&utm#_term = qqfriends "、" images ":" https://m.360buyimg.com/n0/jfs/t6700/ 155/2098998076/156185/6CF95035/595DD5A5NC3A7DAB5.JPG!Q70.jpg "、" num ":2、" pid ":57、" price ":5199、" pscid ":40:" MX150 2Gビデオメモリ]フルHD狭いベゼル8Gメモリ256 SSDは、指紋認識プリインストールされたWin10システム」、「タイトル」: "Xiaomi(Mi)Air 13.3インチフルメタル薄いノートブック(I5-7200U 8G 256G 256G PCLE SSD MX150 2G独立グラフィックスFHDフィンガー認識WINTITION WINTITION WINTITION WINTITIONS Silver/r/n "}、{" BargainPrice ":99、" CreateTime ":" 2017-10-14T21:38:26 "、" dericaturl ":" https://item.jd.com/product/4345173.html? Share&UTM#_CAMPAIGN = T#_335139774&utm#_term = qqfriends "、" images ":" https://m.360buyimg .com/n0/jfs/t6037/35/2944615848/95178/6cd6cff0/594a3a10na4ec7f39.jpg!q70.jpg | https: //m.360buyimg.com/n0/jfs/t6607/258/1025744923/75738/DA120A2D/594A3A12NE3E6BC56.jpg! Q70.jpg | https://m.360buyimg.com/n0/jfs/t6370/292/1057025420/64655/F87644E3/594A3A12 n5b900606.jpg!q70.jpg "、" num ":1、" pid ":45、" price ":2999、" pscid ":39、" selected ":0、" sellerid ":" subhead ":" HDデュアルカメラ、パフォーマンスカメラモンスター!」、「タイトル」:「OnePlus Mobile 5(A5000)6GB+64GB Yueyanhui Full Network Dual Sim Dual Standby Mobile China Unicom 4G Mobile "}] * Sellerid:sellerid:1 */ private string sellername; Private String sellerid;プライベートリスト<listbean> list;プライベートブールチェック。 public boolean ischeck(){return check; } public void setCheck(boolean check){this.check = check; } 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 { /** * bargainprice:22.9 * createTime:2017-10-14T21:48:08 * dericaturl: https://item.m.jd.com/product/2542855.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=qqfriends *画像: https://m.360buyimg.com/n0/jfs/t1930/284/2865629620/390243/e3ade9c4/56f0a08fnbd3a1235.jpg!q70.jpg | https://m.360buyimg.com/n0/jfs/t2137/336/2802996626/155915/e5e90d7a/56f0a09cn33e01bd0.jpg!q70.jpg | https://m.360buyimg.com/n0/jfs/t1882/31/2772215910/389956/C8DBF370/56F0A0A2NA0C86EA6.JPG!Q70.JPG | https://m.360buyimg.com/n0/jfs/t2620/166/2703833710/312660/531AA913/57709035N3857877.jpg!Q70.jpg * num:1 * pid:24 *価格:288.0 * pscid:2 *選択:0 * sellerid:1 * Subhead:3つのリススナック特別オファー、エリアで99を超える99を購入するために50オフ、199以上の購入のために100オフ、急いで購入》 *プライベート文字列createTime; Private String dericaturerl;プライベート文字列画像; private int num; private int pid;プライベートダブル価格。 private int pscid; Private int Selected; private int sellerid;プライベートストリングサブヘッド。プライベートストリングタイトル。 private int cou = 1; public int getCou(){return cou; } public void setcou(int cou){this.cou = cou; }プライベートブールチェック。 public boolean ischeck(){return check; } public void setCheck(boolean check){this.check = check; } 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 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; }}}}アプリ
パブリッククラスMyApp拡張アプリケーション{@Override public void oncreate(){super.oncreate(); fresco.Initialize(this); }}レイヤーを表示します
最初に2つのインターフェイスを記述します
パブリックインターフェイスicart {void showlist(list <cartbean.databean> grouplist、list <list <cartbean.databean.listbean >> ChildList);} public interface iview <t> {void shapbean(t t); void showstr(strings);}メインページレイアウト
<?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:tools = "http://schemas.android.com/tools" android:layout_width = "match_parent" android:layout_height = "match_parent" android: "vertical" tools:context = "com.bwie.zhen20170108.mainactivitiveidicitive Android:id = "@+id /elv" android:layout_weight = "1" android:layout_width = "wrap_content" android:layout_height = "wrap_content" /> <linearlayout android:layout_weight = "9" android: "horizontal" android = "android =" android = "android Android:layout_height = "match_parent"> <チェックボックスAndroid:id = "@+id /quanxuan" android:layout_width = "wrap_content" android:layout_height = "wrap_content" />> <textview android:text = "layout =" layout_widten android:layout_height = "wrap_content" /> <linearlayout android:layout_marginleft = "50dp" android:orientation = "vertical" android:layout_width = "wrap_content" android:layout_height = "wrap_content"> < Android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "合計価格:0.0" /> <textView android:text = "text =" text = "total 0アイテム" Android:layout_height = "wrap_content" /> < /linearlayout> <textView android:text = "total checkout" android "android ="#ffd82020 "android:layout_marginleft =" 100dp "android:layout_width =" wrap_content "android" </linearlayout> </linearlayout>
メインページ
パブリッククラスのMainActivityは、appCompatactivityを実装します。プライベートチェックボックスmquanxuan; Private TextView Mzongjia; Private TextView MtvCount; Private MyExpandableAdapter MyExpandableAdapter; @Override Protected void oncreate(bundle savedinstancestate){super.oncreate(savedinstancestate); setContentView(r.layout.activity_main); initView(); new cartpresenter(this).getCart(); eventbus.getDefault()。レジスタ(this); mquanxuan.setonclicklistener(new View.onclickListener(){@Override public void onclick(View v){myexpandableadapter.qx(mquanxuan.ischecked();}}); } private void initview(){melv =(expandableLeListView)findViewByID(r.id.elv); mquanxuan =(チェックボックス)findviewbyid(r.id.quanxuan); mzongjia =(textView)findViewByid(r.id.zongjia); mtvcount =(textView)findViewById(r.id.tv_count); } @Override public void showlist(list <cartbean.databean> grouplist、list <list <cartbean.databean.listbean >> childlist){myexpandableadapter = new myexpandableadapter(grouplist、this、childlist); melv.setadapter(myexpandableadapter); for(int i = 0; i <grouplist.size(); i ++){melv.expandgroup(i); }} //送信された値を受信しますmtvcount.settext( "total:"+cp.getprice()); } //送信された値を受信します} @Override Protected void ondestroy(){super.ondestroy(); eventbus.getDefault()。Unregister(this); }}2番目のページレイアウト
<?xml version = "1.0" encoding = "utf-8"?> <linearlayout xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:ツール= "http://schemas.android. android:layout_height = "match_parent" android:android = "vertical" android:id = "@+id/activity_add"ツール:context = "com.bwie.zhangzhen2017010108.Addactivity"> <com.facebook.drawee.view. Android:id = "@+id /xqsdv1" android:layout_gravity = "center" android:layout_height = "300dp" /> <textview android: "@+id /tvtitle1" android:layout_width = "match_parent" android = "lapeatent" /> < Android:Orientation = "Horizontal" Android:layout_width = "match_parent" android:layout_height = "wrap_content"> <button android:id = "@+id/tiaozhuan1" android:layout_weight = "1" android:text = "'android:" android: " Android:layout_height = "wrap_content"/> <button android:id = "@+id/tianjia1" android:layout_weight = "1" android: "android =" add "android" android:layout_width = "match_parent" android:layout_heigh
ショッピングカートコードの実装
パブリッククラスの付加性は、appcompatactivityを実装するview.onclicklistener、iview {private simpledraweeview mxqsdv; Private TextView mtvtitle;プライベートボタンmtiaozhuan;プライベートボタンmtianjia;プライベートリニアレイアウトマッダアクティブ;プライベートXQPresenter XQPresenter; @Override Protected void oncreate(bundle savedinstancestate){super.oncreate(savedinstancestate); setContentView(r.layout.activity_add); initView(); xqpresenter = new xqpresenter(this); xqpresenter.getxq(); } private void initview(){mxqsdv =(simpledraweeview)findViewByID(r.id.xqsdv1); mtvtitle =(textView)findViewById(r.id.tvtitle1); mtiaozhuan =(button)findviewbyid(r.id.tiaozhuan1); mtiaozhuan.setonclicklistener(this); mtianjia =(button)findviewbyid(r.id.tianjia1); mtianjia.setonclicklistener(this); maddactivity =(linearlayout)findViewById(r.id.Activity_add); } @Override public void onclick(view v){switch(v.getid()){default:break; // MainActivity(Shopping Cart)ケースr.id.tiaozhuan1:startactivity(new、mainactivity.class));壊す; case r.id.tianjia1:xqpresenter.getadd();壊す; }} @Override public void shapbean(object o){xqbean xqbean =(xqbean)o; xqbean.databean data = xqbean.getData(); String s = data.getImages().split("//|")[0]; Uri uri =Uri.parse(s);//Address converted to URI mXqsdv.setImageURI(uri); mTvtitle.setText(data.getTitle()+"/n"+data.getPrice()); } @Override public void showStr(String s) { Toast.makeText(this, s, Toast.LENGTH_SHORT).show(); }} eventbus包
设置一个数量和价格的类
public class CountAndPrice { private int count ; private int price; public int getCount() { return count; } public void setCount(int count) { this.count = count; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; }}EventBus
public class MessgeEvent { private boolean check; public boolean isCheck() { return check; } public void setCheck(boolean check) { this.check = check; }}モデル
实现详情页model层的接口
public interface IXQModel { public void getXQ(int pid, String str, final OnNetLisenter<XQBean> cgsb);}实现详情页model
public class XQModel implements IXQModel{ @Override public void getXQ(int pid, String str, final OnNetLisenter<XQBean> onNetLisenter) { Flowable<XQBean> flowable = RetrofitHepler.getSerViceAPI().getXQ(pid, str); flowable.observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(new Consumer<XQBean>() { @Override public void accept(XQBean xqBean) throws Exception { onNetLisenter.Success(xqBean); } }); } public void getAdd(int uid, int pid, String str, final OnNetLisenter<AddCart> onNetLisenter){ Flowable<AddCart> flowable = RetrofitHepler.getSerViceAPI().getMsg(uid, pid, str); flowable.observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(new Consumer<AddCart>() { @Override public void accept(AddCart addCart) throws Exception { onNetLisenter.Success(addCart); } }); }}购物车的model
public class CartModel { public void getCart(int uid, String str, final OnNetLisenter<CartBean> onNetLisenter){ Flowable<CartBean> flowable = RetrofitHepler.getSerViceAPI().getCart(uid,str); flowable.observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(new Consumer<CartBean>() { @Override public void accept(CartBean cartBean) throws Exception { onNetLisenter.Success(cartBean); } }); }} presenter层
详情页的P层
public class XQPresenter { private final XQModel xqModel; private IView iView; public XQPresenter(IView iView) { xqModel = new XQModel(); this.iView=iView; } public void getXQ(){ xqModel.getXQ(12, "android", new OnNetLisenter<XQBean>() { @Override public void Success(XQBean xqBean) { iView.showBean(xqBean); } }); } public void getAdd(){ xqModel.getAdd(3043, 12, "android", new OnNetLisenter<AddCart>() { @Override public void Success(AddCart addCart) { iView.showStr(addCart.getMsg()); } }); }}购物车的P层
public class CartPresenter { private ICart iCart; private final CartModel cartModel; public CartPresenter(ICart iCart) { this.iCart = iCart; cartModel = new CartModel(); } public void getCart(){ cartModel.getCart(3043,"android",new OnNetLisenter<CartBean>(){ @Override public void Success(CartBean cartBean) { List<CartBean.DataBean> grouplist = cartBean.getData(); List<List<CartBean.DataBean.ListBean>> childlist = new ArrayList<>(); for (int i = 0; i < grouplist.size(); i++) { CartBean.DataBean dataBean = grouplist.get(i); List<CartBean.DataBean.ListBean> list = dataBean.getList(); childlist.add(list); } iCart.showlist(grouplist,childlist); } }); }}adapter
public class MyExpandableAdapter extends BaseExpandableListAdapter { private List<CartBean.DataBean> groupdata; private Context context; private List<List<CartBean.DataBean.ListBean>> childlist; public MyExpandableAdapter( List<CartBean.DataBean> groupdata, Context context, List<List<CartBean.DataBean.ListBean>> childlist) { this.groupdata = groupdata; this.context = context; this.childlist = childlist; } @Override public int getGroupCount() { return groupdata.size(); } @Override public int getChildrenCount(int groupPosition) { return childlist.get(groupPosition).size(); } @Override public Object getGroup(int groupPosition) { return groupdata.get(groupPosition); } @Override public Object getChild(int groupPosition, int childPosition) { return null; } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return false; } @Override public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { final GroupViewHolder holder; if (convertView == null) { convertView = View.inflate(context, R.layout.group_item, null); holder = new GroupViewHolder(); holder.tv_group = (TextView) convertView.findViewById(R.id.tv_group); holder.group_cb = (CheckBox) convertView.findViewById(R.id.gx_group); convertView.setTag(holder); } else { holder = (GroupViewHolder) convertView.getTag(); } final CartBean.DataBean dataBean = groupdata.get(groupPosition); String sellerName = dataBean.getSellerName(); holder.group_cb.setChecked(dataBean.isCheck()); //点击一级checkbox的状态holder.group_cb.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dataBean.setCheck(holder.group_cb.isChecked()); //改变所有孩子的状态changeChildState(groupPosition,holder.group_cb.isChecked()); EventBus.getDefault().post(jS()); //通过判断一级的checkbox判断全选的状态changeMianQXstatus(checkGroupAll()); notifyDataSetChanged(); } }); return convertView; } @Override public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { final ChildViewHolder holder; if (convertView == null) { convertView = View.inflate(context, R.layout.child_item, null); holder = new ChildViewHolder(); holder.tv_title= (TextView) convertView.findViewById(R.id.title); holder.price= (TextView) convertView.findViewById(R.id.price); holder.child_cb= (CheckBox) convertView.findViewById(R.id.gouxuan_child); holder.add= (TextView) convertView.findViewById(R.id.jia); holder.del= (TextView) convertView.findViewById(R.id.del); holder.jian= (TextView) convertView.findViewById(R.id.jian); holder.sdv= (SimpleDraweeView) convertView.findViewById(R.id.title_img); holder.tv_num= (TextView) convertView.findViewById(R.id.tv_num); holder.yanse= (TextView) convertView.findViewById(R.id.yanse); convertView.setTag(holder); } else { holder = (ChildViewHolder) convertView.getTag(); } final CartBean.DataBean.ListBean listBean = childlist.get(groupPosition).get(childPosition); int price = (int) listBean.getPrice(); holder.child_cb.setChecked(listBean.isCheck()); holder.price.setText("¥:"+price+""); String title = listBean.getTitle(); holder.tv_title.setText(title); String subhead = listBean.getSubhead(); String substring = subhead.substring(1, 10)+"....."; holder.yanse.setText(substring); String images = listBean.getImages(); String[] split = images.split("//|"); String s = split[0]; Uri uri=Uri.parse(s); holder.sdv.setImageURI(uri); // listBean.setCou(Integer.parseInt(holder.tv_num.getText().toString())); //给子条目的checkBox点击事件holder.child_cb.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { listBean.setCheck(holder.child_cb.isChecked()); EventBus.getDefault().post(jS()); //如果二级的checkBox选中,就让一级的checkBox勾选if(holder.child_cb.isChecked()) { if (ischeckAllchild(groupPosition)) { //改变一级checkBox的状态changeGroupstatus(groupPosition,true); //通过判断一级的CheckBox的状态来改变全选的状态changeMianQXstatus(checkGroupAll()); } }else{ changeGroupstatus(groupPosition,false); changeMianQXstatus(checkGroupAll()); } notifyDataSetChanged(); } }); //点击加加的功能holder.add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int cou = listBean.getCou(); holder.tv_num.setText(++cou+""); listBean.setCou(cou); if(holder.child_cb.isChecked()){ EventBus.getDefault().post(jS()); } } }); //点击减减的功能holder.jian.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int cou = listBean.getCou(); if(cou==1) { Toast.makeText(context, "最小数量为1", Toast.LENGTH_SHORT).show(); return;} holder.tv_num.setText(--cou+""); listBean.setCou(cou); if (holder.child_cb.isChecked()) { EventBus.getDefault().post(jS()); } } }); //点击删除holder.del.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { List<CartBean.DataBean.ListBean> listBeen = childlist.get(groupPosition); CartBean.DataBean.ListBean remove = listBeen.remove(childPosition); if(listBeen.size()==0){ childlist.remove(childPosition); groupdata.remove(groupPosition); } EventBus.getDefault().post(jS()); notifyDataSetChanged(); } }); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } class GroupViewHolder { CheckBox group_cb; TextView tv_group; } class ChildViewHolder { CheckBox child_cb; TextView tv_title,price,yanse,tv_num; TextView del,add,jian; SimpleDraweeView sdv; } /** * 判断全部的二级是CheckBox否选中* */ private boolean ischeckAllchild(int g){ List<CartBean.DataBean.ListBean> listBeen = childlist.get(g); for (int i = 0; i <listBeen.size() ; i++) { CartBean.DataBean.ListBean listBean = listBeen.get(i); if(!listBean.isCheck()){ return false; } } return true; } /** * 计算数量和价格* 通过遍历一级的得到二级的CheckBox,如果是选择的选中状态的话,就统计它们的总计的数量和价格*/ private CountAndPrice jS(){ int cou=0; int jiage=0; for (int i = 0; i <groupdata.size() ; i++) { for (int j = 0; j <childlist.get(i).size() ; j++) { CartBean.DataBean.ListBean listBean = childlist.get(i).get(j); if(listBean.isCheck()){ cou+=listBean.getCou(); jiage+=(int)listBean.getPrice()*listBean.getCou(); } } } CountAndPrice countAndPrice = new CountAndPrice(); countAndPrice.setCount(cou); countAndPrice.setPrice(jiage); return countAndPrice; } /** * 改变一级列表的状态*/ private void changeGroupstatus(int groupPosition,boolean flag ){ CartBean.DataBean dataBean = groupdata.get(groupPosition); dataBean.setCheck(flag); } /** * 改变全选的状态* */ private void changeMianQXstatus(boolean flag){ MessgeEvent messgeEvent = new MessgeEvent(); messgeEvent.setCheck(flag); EventBus.getDefault().post(messgeEvent); } /** * 判断一级的是否全部选中*/ private boolean checkGroupAll(){ for (int i = 0; i < groupdata.size(); i++) { if(!groupdata.get(i).isCheck()){ return false; } } return true; } /** * 改变所有孩子的状态*/ private void changeChildState(int grouPistion,boolean flag){ List<CartBean.DataBean.ListBean> listBeen = childlist.get(grouPistion); for (int i = 0; i < listBeen.size(); i++) { listBeen.get(i).setCheck(flag); } } /** * 改变全选的*/ public void qx(boolean flag){ for (int i = 0; i < groupdata.size(); i++) { changeGroupstatus(i, flag); changeChildState(i, flag); } EventBus.getDefault().post(jS()); notifyDataSetChanged(); }}group_item.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <CheckBox android:id="@+id/gx_group" android:focusable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_group" android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>
child_item.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/title" android:layout_marginLeft="20dp" android:layout_width="match_parent" android:layout_height="wrap_content" /> <LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"> <CheckBox android:layout_marginLeft="20dp" android:gravity="center_vertical" android:id="@+id/gouxuan_child" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <com.facebook.drawee.view.SimpleDraweeView android:gravity="center_vertical" android:id="@+id/title_img" android:layout_width="50dp" android:layout_height="50dp" /> <LinearLayout android:orientation="vertical" android:layout_marginLeft="30dp" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/price" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/yanse" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <LinearLayout android:layout_marginLeft="100dp" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/jian" android:layout_width="20dp" android:layout_height="20dp" android:textSize="15sp" android:text="一"/> <TextView android:id="@+id/tv_num" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:paddingBottom="2dp" android:paddingLeft="20dp" android:paddingRight="20dp" android:paddingTop="2dp" android:text="1" /> <TextView android:id="@+id/jia" android:layout_width="20dp" android:layout_height="20dp" android:layout_marginLeft="5dp" android:text="+" android:textSize="15sp"/> </LinearLayout> </LinearLayout> <TextView android:id="@+id/del" android:layout_marginLeft="20dp" android:text="删除" android:textColor="#FFFFFF" android:background="#ff3660" android:layout_width="32dp" android:layout_height="29dp" /> </LinearLayout></LinearLayout>
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。