config.gradle
ext {
android = [
compileSdkVersion: 26,
applicationId : "com.bwie.test.test_week2",
minSdkVersion : 15,
targetSdkVersion : 26,
versionCode : 1,
versionName : "1.0"
]
dependencies = [
"appcompat-v7" : "com.android.support:appcompat-v7:26.1.0",
"constraint-layout": "com.android.support.constraint:constraint-layout:1.1.0",
"retrofit2" : "com.squareup.retrofit2:retrofit:2.4.0",
"converter-gson" : "com.squareup.retrofit2:converter-gson:2.4.0",
"adapter-rxjava" : "com.squareup.retrofit2:adapter-rxjava2:2.4.0",
"rxjava2" : "io.reactivex.rxjava2:rxjava:2.1.13",
"rxjava2:rxandroid": "io.reactivex.rxjava2:rxandroid:2.0.2",
"dagger" : "com.google.dagger:dagger:2.8",
"dagger-compiler" : "com.google.dagger:dagger-compiler:2.7"
]
}
工程下的grale
apply from:'config.gradle'
项目的grale
implementation rootProject.ext.dependencies["appcompat-v7"]
implementation rootProject.ext.dependencies["constraint-layout"]
implementation rootProject.ext.dependencies["retrofit2"]
implementation rootProject.ext.dependencies["converter-gson"]
implementation rootProject.ext.dependencies["rxjava2"]
implementation rootProject.ext.dependencies["rxjava2:rxandroid"]
implementation rootProject.ext.dependencies["dagger"]
annotationProcessor rootProject.ext.dependencies["dagger-compiler"]
implementation rootProject.ext.dependencies["adapter-rxjava"]
implementation 'com.facebook.fresco:fresco:0.12.0'
// 支持 GIF 动图,需要添加
implementation 'com.facebook.fresco:animated-gif:0.12.0'
implementation 'com.android.support:support-v4:26.1.0'
implementation 'com.sunfusheng:marqueeview:1.3.3'
implementation 'com.jcodecraeer:xrecyclerview:1.3.2'
implementation 'com.youth.banner:banner:1.4.10'
implementation 'com.android.support:design:26.1.0'
implementation 'com.github.bumptech.glide:glide:3.7.0'
implementation 'jp.wasabeef:glide-transformations:1.0.6'
implementation 'org.greenrobot:eventbus:3.1.1'
cart_biankuang
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#ffffff" />
<stroke
android:width="0.1dp"
android:color="#000000" />
</shape>
activity_main
<?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:orientation="vertical"
tools:context=".ui.shopcart.MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="购物车"/>
<ExpandableListView
android:id="@+id/elv"
android:groupIndicator="@null"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"></ExpandableListView>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="40dp">
<CheckBox
android:id="@+id/cbAll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="全选"/>
<TextView
android:id="@+id/tvMoney"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@id/cbAll"
android:text="合计:"/>
<TextView
android:id="@+id/tvTotal"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:textColor="#ffffff"
android:background="#ff0000"
android:gravity="center"
android:layout_marginLeft="10dp"
android:text="去结算:"/>
</RelativeLayout>
</LinearLayout>
自定义加减号布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/child_image"
android:layout_marginRight="5dp"
android:layout_toLeftOf="@+id/child_text_delete"
android:orientation="horizontal">
<TextView
android:id="@+id/child_text_jian"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/cart_biankuang"
android:padding="5dp"
android:text="-"/>
<TextView
android:id="@+id/child_text_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/cart_biankuang"
android:paddingBottom="5dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:paddingTop="5dp"/>
<TextView
android:id="@+id/child_text_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/cart_biankuang"
android:padding="5dp"
android:text="+"/>
</LinearLayout>
shopcart_sellor_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="30dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<CheckBox
android:id="@+id/cbSeller"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"/>
<TextView
android:id="@+id/tvSeller"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"/>
</LinearLayout>
shopcart_sellor_product_item
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/cbProduct"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="20dp"/>
<TextView
android:id="@+id/tvDel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="15dp"
android:background="#ff0000"
android:gravity="center_vertical"
android:text="删除"
android:textColor="#ffffff"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/tvDel"
android:layout_toRightOf="@id/cbProduct"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_gravity="center_vertical"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:orientation="vertical">
<TextView
android:id="@+id/tvTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/tvPrice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:text="12312"
android:textColor="#ff0000"/>
<com.bwie.test.test_week2.ui.shopcart.AddSubView
android:id="@+id/addSubCard"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"></com.bwie.test.test_week2.ui.shopcart.AddSubView>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
工具包 -util
Dalogutil
import android.app.ProgressDialog;
import android.content.Context;
public class DialogUtil {
public static ProgressDialog getProgressDialog(Context context){
ProgressDialog progressDialog = new ProgressDialog(context);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setMessage("正在加载");
progressDialog.setCancelable(false);
return progressDialog;
}
}
SharedPreferencesUtils工具类
public class SharedPreferencesUtils {
/**
* 保存在手机里面的文件名
*/
private static final String FILE_NAME = "share_date";
/**
* 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
* @param context
* @param key
* @param object
*/
public static void setParam(Context context , String key, Object object){
String type = object.getClass().getSimpleName();
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
if("String".equals(type)){
editor.putString(key, (String)object);
}
else if("Integer".equals(type)){
editor.putInt(key, (Integer)object);
}
else if("Boolean".equals(type)){
editor.putBoolean(key, (Boolean)object);
}
else if("Float".equals(type)){
editor.putFloat(key, (Float)object);
}
else if("Long".equals(type)){
editor.putLong(key, (Long)object);
}
editor.commit();
}
/**
* 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
* @param context
* @param key
* @param defaultObject
* @return
*/
public static Object getParam(Context context , String key, Object defaultObject){
String type = defaultObject.getClass().getSimpleName();
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
if("String".equals(type)){
return sp.getString(key, (String)defaultObject);
}
else if("Integer".equals(type)){
return sp.getInt(key, (Integer)defaultObject);
}
else if("Boolean".equals(type)){
return sp.getBoolean(key, (Boolean)defaultObject);
}
else if("Float".equals(type)){
return sp.getFloat(key, (Float)defaultObject);
}
else if("Long".equals(type)){
return sp.getLong(key, (Long)defaultObject);
}
return null;
}
}
自定义view AddSubView
public class AddSubView extends LinearLayout {
private TextView sub;
private TextView num;
private TextView add;
public AddSubView(Context context) {
this(context, null);
}
public AddSubView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
View view = LayoutInflater.from(context).inflate(R.layout.add_sub_view, this);
sub = findViewById(R.id.child_text_jian);
num = findViewById(R.id.child_text_num);
add = findViewById(R.id.child_text_add);
}
/**
* 设置数量
* @param str
*/
public void setNum(String str) {
num.setText(str);
}
/**
* 获取数量
*
* @return
*/
public String getNum() {
return num.getText().toString();
}
/**
* 给加号设置点击事件
*
* @param onclickListener
*/
public void setAddOnclickListener(OnClickListener onclickListener) {
add.setOnClickListener(onclickListener);
}
/**
* 给减号设置点击事件
*
* @param onclickListener
*/
public void setSubOnclickListener(OnClickListener onclickListener) {
sub.setOnClickListener(onclickListener);
}
}
bean包--BaseBean
public class BaseBean {
/**
* msg : 加购成功
* code : 0
*/
private String msg;
private String code;
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;
}
}
GetCartBean
public class GetCartsBean {
/**
* msg : 请求成功
* code : 0
* data : [{"list":[{"bargainPrice":6666,"createtime":"2017-10-10T16:01:31","detailUrl":"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/282106/68af5b54/59b8480aNe8af7f5c.jpg!q70.jpg|https://m.360buyimg
* .com/n0/jfs/t8434/54/1359766007/56140/579509d9/59b85801Nfea207db.jpg!q70.jpg","num":2,"pid":46,"price":234,
* "pscid":39,"selected":1,"sellerid":2,"subhead":"【iPhone新品上市】新一代iPhone,让智能看起来更不一样","title":"Apple iPhone 8 Plus
* (A1864) 64GB 金色 移动联通电信4G手机"},{"bargainPrice":11800,"createtime":"2017-10-14T21:38:26",
* "detailUrl":"https://item.m.jd.com/product/5025518.html?utm#_source=androidapp&utm#_medium=appshare&utm
* #_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg
* .com/n0/jfs/t8830/106/1760940277/195595/5cf9412f/59bf2ef5N5ab7dc16.jpg!q70.jpg|https://m.360buyimg
* .com/n0/jfs/t5428/70/1520969931/274676/b644dd0d/591128e7Nd2f70da0.jpg!q70.jpg|https://m.360buyimg
* .com/n0/jfs/t5566/365/1519564203/36911/620c750c/591128eaN54ac3363.jpg!q70.jpg","num":7,"pid":58,"price":6399,
* "pscid":40,"selected":1,"sellerid":2,"subhead":"升级4G大显存!Nvme协议Pcie SSD,速度快人一步】GTX1050Ti就选拯救者!专业游戏键盘&新模具全新设计!",
* "title":"联想(Lenovo)拯救者R720 15.6英寸游戏笔记本电脑(i5-7300HQ 8G 1T+128G SSD GTX1050Ti 4G IPS 黑)"}],"sellerName":"商家2",
* "sellerid":"2"},{"list":[{"bargainPrice":22.9,"createtime":"2017-10-03T23:53:28","detailUrl":"https://item.m
* .jd.com/product/2542855.html?utm_source=androidapp&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/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/57709035N33857877.jpg!q70.jpg","num":1,"pid":26,"price":88,
* "pscid":2,"selected":1,"sellerid":3,"subhead":"三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》","title":"三只松鼠 坚果炒货 零食奶油味
* 碧根果225g/袋"}],"sellerName":"商家3","sellerid":"3"},{"list":[{"bargainPrice":22.9,
* "createtime":"2017-10-14T21:38:26","detailUrl":"https://item.m.jd
* .com/product/2542855.html?utm_source=androidapp&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/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/57709035N33857877.jpg!q70.jpg","num":2,"pid":27,"price":488,
* "pscid":2,"selected":1,"sellerid":4,"subhead":"三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》","title":"三只松鼠 坚果炒货 零食奶油味
* 碧根果225g/袋"},{"bargainPrice":11800,"createtime":"2017-10-14T21:48:08","detailUrl":"https://mitem.jd
* .hk/ware/view.action?wareId=1988853309&cachekey=1acb07a701ece8d2434a6ae7fa6870a1",
* "images":"https://m.360buyimg.com/n0/jfs/t6130/97/1370670410/180682/1109582a/593276b1Nd81fe723.jpg!q70.jpg
* |https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f
* .jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f
* .jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5815/178/2614671118/51656/7f52d137/593276c7N107b725a
* .jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5878/60/2557817477/30873/4502b606/593276caN5a7d6357.jpg!q70.jpg",
* "num":2,"pid":60,"price":13888,"pscid":40,"selected":1,"sellerid":4,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)",
* "title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"}],"sellerName":"商家4","sellerid":"4"},
* {"list":[{"bargainPrice":22.9,"createtime":"2017-10-03T23:53:28","detailUrl":"https://item.m.jd
* .com/product/2542855.html?utm_source=androidapp&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/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/57709035N33857877.jpg!q70.jpg","num":1,"pid":31,"price":788,
* "pscid":2,"selected":1,"sellerid":8,"subhead":"三只松鼠零食特惠,专区满99减50,满199减100,火速抢购》","title":"三只松鼠 坚果炒货 零食奶油味
* 碧根果225g/袋"},{"bargainPrice":3455,"createtime":"2017-10-03T23:53:28","detailUrl":"https://item.m.jd
* .com/product/12224420750.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term
* =QQfriends","images":"https://m.360buyimg
* .com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg
* .com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg
* .com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg
* .com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg
* .com/n0/jfs/t8803/356/1478945529/489755/2a163ace/59ba5e84N7bb9a666.jpg!q70.jpg","num":1,"pid":52,"price":666,
* "pscid":39,"selected":1,"sellerid":8,"subhead":"【现货新品抢购】全面屏2.0震撼来袭,骁龙835处理器,四曲面陶瓷机","title":"小米(MI) 小米MIX2 手机
* 黑色 全网通 (6GB+64GB)【标配版】"}],"sellerName":"商家8","sellerid":"8"},{"list":[{"bargainPrice":11800,
* "createtime":"2017-10-03T23:53:28","detailUrl":"https://mitem.jd.hk/ware/view
* .action?wareId=1988853309&cachekey=1acb07a701ece8d2434a6ae7fa6870a1","images":"https://m.360buyimg
* .com/n0/jfs/t6130/97/1370670410/180682/1109582a/593276b1Nd81fe723.jpg!q70.jpg|https://m.360buyimg
* .com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg
* .com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg
* .com/n0/jfs/t5815/178/2614671118/51656/7f52d137/593276c7N107b725a.jpg!q70.jpg|https://m.360buyimg
* .com/n0/jfs/t5878/60/2557817477/30873/4502b606/593276caN5a7d6357.jpg!q70.jpg","num":1,"pid":67,"price":14000,
* "pscid":40,"selected":1,"sellerid":11,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)","title":"全球购 新款Apple MacBook
* Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"}],"sellerName":"商家11","sellerid":"11"},{"list":[{"bargainPrice":111.99,
* "createtime":"2017-10-14T21:39:05","detailUrl":"https://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/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":1,"pid":20,"price":599,
* "pscid":1,"selected":1,"sellerid":13,
* "subhead":"每个中秋都不能简单,无论身在何处,你总需要一块饼让生活更圆满,京东月饼让爱更圆满京东自营,闪电配送,更多惊喜,快用手指戳一下","title":"北京稻香村 稻香村中秋节月饼
* 老北京月饼礼盒655g"}],"sellerName":"商家13","sellerid":"13"},{"list":[{"bargainPrice":111.99,
* "createtime":"2017-10-14T21:39:05","detailUrl":"https://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/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":2,"pid":1,"price":118,
* "pscid":1,"selected":1,"sellerid":17,
* "subhead":"每个中秋都不能简单,无论身在何处,你总需要一块饼让生活更圆满,京东月饼让爱更圆满京东自营,闪电配送,更多惊喜,快用手指戳一下","title":"北京稻香村 稻香村中秋节月饼
* 老北京月饼礼盒655g"}],"sellerName":"商家17","sellerid":"17"},{"list":[{"bargainPrice":111.99,
* "createtime":"2017-10-14T21:39:05","detailUrl":"https://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/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":2,"pid":2,"price":299,
* "pscid":1,"selected":1,"sellerid":18,
* "subhead":"每个中秋都不能简单,无论身在何处,你总需要一块饼让生活更圆满,京东月饼让爱更圆满京东自营,闪电配送,更多惊喜,快用手指戳一下","title":"北京稻香村 稻香村中秋节月饼
* 老北京月饼礼盒655g"},{"bargainPrice":11800,"createtime":"2017-10-03T23:53:28","detailUrl":"https://mitem.jd
* .hk/ware/view.action?wareId=1988853309&cachekey=1acb07a701ece8d2434a6ae7fa6870a1",
* "images":"https://m.360buyimg.com/n0/jfs/t6130/97/1370670410/180682/1109582a/593276b1Nd81fe723.jpg!q70.jpg
* |https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f
* .jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f
* .jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5815/178/2614671118/51656/7f52d137/593276c7N107b725a
* .jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5878/60/2557817477/30873/4502b606/593276caN5a7d6357.jpg!q70.jpg",
* "num":1,"pid":74,"price":35999,"pscid":40,"selected":1,"sellerid":18,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)",
* "title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"}],"sellerName":"商家18","sellerid":"18"},
* {"list":[{"bargainPrice":11800,"createtime":"2017-10-14T21:38:26","detailUrl":"https://mitem.jd.hk/ware/view
* .action?wareId=1988853309&cachekey=1acb07a701ece8d2434a6ae7fa6870a1","images":"https://m.360buyimg
* .com/n0/jfs/t6130/97/1370670410/180682/1109582a/593276b1Nd81fe723.jpg!q70.jpg|https://m.360buyimg
* .com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg
* .com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg
* .com/n0/jfs/t5815/178/2614671118/51656/7f52d137/593276c7N107b725a.jpg!q70.jpg|https://m.360buyimg
* .com/n0/jfs/t5878/60/2557817477/30873/4502b606/593276caN5a7d6357.jpg!q70.jpg","num":7,"pid":75,"price":36999,
* "pscid":40,"selected":1,"sellerid":19,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)","title":"全球购 新款Apple MacBook
* Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"}],"sellerName":"商家19","sellerid":"19"},{"list":[{"bargainPrice":111.99,
* "createtime":"2017-10-03T23:53:28","detailUrl":"https://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/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":2,"pid":6,"price":7.99,
* "pscid":1,"selected":1,"sellerid":22,
* "subhead":"每个中秋都不能简单,无论身在何处,你总需要一块饼让生活更圆满,京东月饼让爱更圆满京东自营,闪电配送,更多惊喜,快用手指戳一下","title":"北京稻香村 稻香村中秋节月饼
* 老北京月饼礼盒655g"},{"bargainPrice":11800,"createtime":"2017-10-14T21:38:26","detailUrl":"https://mitem.jd
* .hk/ware/view.action?wareId=1988853309&cachekey=1acb07a701ece8d2434a6ae7fa6870a1",
* "images":"https://m.360buyimg.com/n0/jfs/t6130/97/1370670410/180682/1109582a/593276b1Nd81fe723.jpg!q70.jpg
* |https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f
* .jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f
* .jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5815/178/2614671118/51656/7f52d137/593276c7N107b725a
* .jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5878/60/2557817477/30873/4502b606/593276caN5a7d6357.jpg!q70.jpg",
* "num":2,"pid":78,"price":999,"pscid":40,"selected":1,"sellerid":22,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)",
* "title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"}],"sellerName":"商家22","sellerid":"22"}]
*/
private String msg;
private String code;
private List<DataBean> data;
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> data) {
this.data = data;
}
public static class DataBean {
/**
* list : [{"bargainPrice":6666,"createtime":"2017-10-10T16:01:31","detailUrl":"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/282106/68af5b54/59b8480aNe8af7f5c.jpg!q70.jpg|https://m.360buyimg
* .com/n0/jfs/t8434/54/1359766007/56140/579509d9/59b85801Nfea207db.jpg!q70.jpg","num":2,"pid":46,
* "price":234,"pscid":39,"selected":1,"sellerid":2,"subhead":"【iPhone新品上市】新一代iPhone,让智能看起来更不一样",
* "title":"Apple iPhone 8 Plus (A1864) 64GB 金色 移动联通电信4G手机"},{"bargainPrice":11800,
* "createtime":"2017-10-14T21:38:26","detailUrl":"https://item.m.jd
* .com/product/5025518.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term
* =QQfriends","images":"https://m.360buyimg
* .com/n0/jfs/t8830/106/1760940277/195595/5cf9412f/59bf2ef5N5ab7dc16.jpg!q70.jpg|https://m.360buyimg
* .com/n0/jfs/t5428/70/1520969931/274676/b644dd0d/591128e7Nd2f70da0.jpg!q70.jpg|https://m.360buyimg
* .com/n0/jfs/t5566/365/1519564203/36911/620c750c/591128eaN54ac3363.jpg!q70.jpg","num":7,"pid":58,
* "price":6399,"pscid":40,"selected":1,"sellerid":2,"subhead":"升级4G大显存!Nvme协议Pcie SSD,
* 速度快人一步】GTX1050Ti就选拯救者!专业游戏键盘&新模具全新设计!","title":"联想(Lenovo)拯救者R720 15.6英寸游戏笔记本电脑(i5-7300HQ 8G 1T+128G SSD
* GTX1050Ti 4G IPS 黑)"}]
* sellerName : 商家2
* sellerid : 2
*/
private String sellerName;
private String sellerid;
private List<ListBean> list;
public String getSellerName() {
return sellerName;
}
public void setSellerName(String sellerName) {
this.sellerName = sellerName;
}
public String getSellerid() {
return sellerid;
}
public void setSellerid(String sellerid) {
this.sellerid = sellerid;
}
public List<ListBean> getList() {
return list;
}
public void setList(List<ListBean> list) {
this.list = list;
}
public static class ListBean {
/**
* bargainPrice : 6666.0
* createtime : 2017-10-10T16:01:31
* detailUrl : 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/282106/68af5b54/59b8480aNe8af7f5c
* .jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8434/54/1359766007/56140/579509d9/59b85801Nfea207db
* .jpg!q70.jpg
* num : 2
* pid : 46
* price : 234.0
* pscid : 39
* selected : 1
* sellerid : 2
* subhead : 【iPhone新品上市】新一代iPhone,让智能看起来更不一样
* title : Apple iPhone 8 Plus (A1864) 64GB 金色 移动联通电信4G手机
*/
private double bargainPrice;
private String createtime;
private String detailUrl;
private String images;
private int num;
private int pid;
private double price;
private int pscid;
private int selected;
private int sellerid;
private String subhead;
private String title;
public double getBargainPrice() {
return bargainPrice;
}
public void setBargainPrice(double bargainPrice) {
this.bargainPrice = bargainPrice;
}
public String getCreatetime() {
return createtime;
}
public void setCreatetime(String createtime) {
this.createtime = createtime;
}
public String getDetailUrl() {
return detailUrl;
}
public void setDetailUrl(String detailUrl) {
this.detailUrl = detailUrl;
}
public String getImages() {
return images;
}
public void setImages(String images) {
this.images = images;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getPscid() {
return pscid;
}
public void setPscid(int pscid) {
this.pscid = pscid;
}
public int getSelected() {
return selected;
}
public void setSelected(int selected) {
this.selected = selected;
}
public int getSellerid() {
return sellerid;
}
public void setSellerid(int sellerid) {
this.sellerid = sellerid;
}
public String getSubhead() {
return subhead;
}
public void setSubhead(String subhead) {
this.subhead = subhead;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
}
}
bean---SellerBean
import java.io.Serializable;
public class SellerBean implements Serializable{
private String sellerName;
private String sellerid;
private boolean selected;//商家是否选中
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
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;
}
}
inter包 - IBase
public interface IBase {
int getContentLayout();
void inject();
void initView(View view);
}
OnItemClickListener
public interface OnItemClickListener {
void onItemClick(int position);
void onLongItemClick(int position);
}
net包 ----Api
public interface Api {
String BASEURL="https://www.zhaoapi.cn/";
}
拦截器
import java.io.IOException;
import okhttp3.FormBody;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
public class MyInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
//创建一个FormBody.Builder对象,用于添加公共参数
FormBody.Builder builder = new FormBody.Builder();
//先获取原始的请求
Request originalRequest = chain.request();
//获取原始请求里的请求体数据
FormBody formBody = (FormBody) originalRequest.body();
for (int i = 0; i < formBody.size(); i++) {
//先把原始的请求体的参数添加到builder里
builder.add(formBody.name(i),formBody.value(i));
}
//添加公共参数
builder.add("source","android");
FormBody body = builder.build();
//创建一个新的Request
Request request = new Request.Builder()
.url(originalRequest.url())
.post(body)
.build();
Response response = chain.proceed(request);
return response;
}
}
net包 GetCartApiService
import io.reactivex.Observable;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
public interface GetCartApiService {
@FormUrlEncoded
@POST("product/getCarts")
Observable<GetCartsBean> getCart(@Field("Uid") String uid,
@Field("Token") String token);
}
GetCartApi
import io.reactivex.Observable;
public class GetCartApi {
private static GetCartApi getCartApi;
private GetCartApiService getCartApiService;
private GetCartApi(GetCartApiService getCartApiService) {
this.getCartApiService = getCartApiService;
}
public static GetCartApi getGetCartApi(GetCartApiService getCartApiService) {
if (getCartApi == null) {
getCartApi = new GetCartApi(getCartApiService);
}
return getCartApi;
}
public Observable<GetCartsBean> getCatagory(String uid, String token) {
return getCartApiService.getCart(uid, token);
}
}
DeleteCartApiService
public interface DeleteCartApiService {
@FormUrlEncoded
@POST("product/deleteCart")
Observable<BaseBean> deleteCart(@Field("uid") String uid,
@Field("pid") String pid,
@Field("token") String token);
}
DeleteCartApi
public class DeleteCartApi {
private static DeleteCartApi deleteCartApi;
private DeleteCartApiService deleteCartApiService;
private DeleteCartApi(DeleteCartApiService deleteCartApiService) {
this.deleteCartApiService = deleteCartApiService;
}
public static DeleteCartApi getDeleteCartApi(DeleteCartApiService deleteCartApiService) {
if (deleteCartApi == null) {
deleteCartApi = new DeleteCartApi(deleteCartApiService);
}
return deleteCartApi;
}
public Observable<BaseBean> deleteCart(String uid, String pid,
String token) {
return deleteCartApiService.deleteCart(uid, pid, token);
}
}
UpdateCartApiService
public interface UpdateCartApiService {
@FormUrlEncoded
@POST("product/updateCarts")
Observable<BaseBean> updateCarts(@Field("uid") String uid,
@Field("sellerid") String sellerid,
@Field("pid") String pid,
@Field("num") String num,
@Field("selected") String selected,
@Field("token") String token);
}
updateCartApi
public class UpdateCartApi {
private static UpdateCartApi updateCartApi;
private UpdateCartApiService updateCartApiService;
private UpdateCartApi(UpdateCartApiService updateCartApiService) {
this.updateCartApiService = updateCartApiService;
}
public static UpdateCartApi getUpdateCartApi(UpdateCartApiService updateCartApiService) {
if (updateCartApi == null) {
updateCartApi = new UpdateCartApi(updateCartApiService);
}
return updateCartApi;
}
public Observable<BaseBean> updateCarts(String uid, String sellerid, String pid, String num, String selected,
String token) {
return updateCartApiService.updateCarts(uid, sellerid, pid, num, selected, token);
}
}
base包 BasePresenter
public class BasePresenter<T extends BaseContract.BaseView> implements BaseContract.BasePresenter<T> {
protected T mView;
@Override
public void attchView(T view) {
this.mView = view;
}
@Override
public void detachView() {
if (mView != null) {
mView = null;
}
}
}
BaseContract
public interface BaseContract {
//抽取所有Presenter共性,比如绑定,解绑
interface BasePresenter<T extends BaseView> {
void attchView(T view);
void detachView();
}
//抽取所有View的共性,比如显示进度条和关闭进度
interface BaseView {
void showLoading();
void dismissLoading();
}
}
BaseActivity
public abstract class BaseActivity<T extends BaseContract.BasePresenter> extends AppCompatActivity implements IBase,
BaseContract.BaseView {
@Inject
protected T mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentLayout());
inject();
//绑定
if (mPresenter != null) {
mPresenter.attchView(this);
}
}
@Override
public void initView(View view) {
}
@Override
protected void onDestroy() {
super.onDestroy();
//解绑
if (mPresenter != null) {
mPresenter.detachView();
}
}
@Override
public void showLoading() {
}
@Override
public void dismissLoading() {
}
protected String getUid() {
return (String) SharedPreferencesUtils.getParam(this, "uid", "1235");
}
protected String getToken() {
return (String) SharedPreferencesUtils.getParam(this, "token", "5B5E60DC8960BA6DBCF3CBA638A1EC32");
}
protected void toast(String str){
Toast.makeText(this,str,Toast.LENGTH_SHORT).show();
}
}
HttpModule
import java.util.concurrent.TimeUnit;
import dagger.Module;
import dagger.Provides;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
@Module()
public class HttpModule {
@Provides
OkHttpClient.Builder provideOkHttpClientBuilder(){
return new OkHttpClient.Builder()
.writeTimeout(20, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.connectTimeout(10, TimeUnit.SECONDS);
}
@Provides
GetCartApi provideGetCartApi(OkHttpClient.Builder builder) {
builder.addInterceptor(new MyInterceptor());
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Api.BASEURL)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(builder.build())
.build();
GetCartApiService getCartApiService = retrofit.create(GetCartApiService.class);
return GetCartApi.getGetCartApi(getCartApiService);
}
@Provides
UpdateCartApi provideUpdateCartApi(OkHttpClient.Builder builder) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Api.BASEURL)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(builder.build())
.build();
UpdateCartApiService updateCartApiService = retrofit.create(UpdateCartApiService.class);
return UpdateCartApi.getUpdateCartApi(updateCartApiService);
}
@Provides
DeleteCartApi provideDeleteCartApi(OkHttpClient.Builder builder) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Api.BASEURL)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(builder.build())
.build();
DeleteCartApiService deleteCartApiService = retrofit.create(DeleteCartApiService.class);
return DeleteCartApi.getDeleteCartApi(deleteCartApiService);
}
}
HttpComponent
@Component(modules = HttpModule.class)
public interface HttpComponent {
void inject(MainActivity mainActivity);
}
ui---shopcart包
ShopCartPresenter
public class ShopCartPresenter extends BasePresenter<ShopContract.View> implements ShopContract.Presenter {
private GetCartApi getCartApi;
private UpdateCartApi updateCartApi;
private DeleteCartApi deleteCartApi;
@Inject
public ShopCartPresenter(GetCartApi getCartApi, UpdateCartApi updateCartApi, DeleteCartApi deleteCartApi) {
this.getCartApi = getCartApi;
this.updateCartApi = updateCartApi;
this.deleteCartApi = deleteCartApi;
}
@Override
public void getCarts(String uid, String token) {
getCartApi.getCatagory(uid, token)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<GetCartsBean>() {
@Override
public void accept(GetCartsBean getCartsBean) throws Exception {
List<SellerBean> groupList = new ArrayList<>();//用于封装一级列表
List<List<GetCartsBean.DataBean.ListBean>> childList = new ArrayList<>();//用于封装二级列表
List<GetCartsBean.DataBean> data = getCartsBean.getData();
if (data == null) {
return;
}
for (int i = 0; i < data.size(); i++) {
GetCartsBean.DataBean dataBean = data.get(i);
SellerBean sellerBean = new SellerBean();
sellerBean.setSellerName(dataBean.getSellerName());
sellerBean.setSellerid(dataBean.getSellerid());
sellerBean.setSelected(isSellerProductAllSelect(dataBean));
//true或者false要根据该商家下面的商品是否全选
groupList.add(sellerBean);
List<GetCartsBean.DataBean.ListBean> list = dataBean.getList();
childList.add(list);
}
if (mView != null) {
mView.showCartList(groupList, childList);
}
}
});
}
@Override
public void updateCarts(String uid, String sellerid, String pid, String num, String selected, String token) {
updateCartApi.updateCarts(uid, sellerid, pid, num, selected, token)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map(new Function<BaseBean, String>() {
@Override
public String apply(BaseBean baseBean) throws Exception {
return baseBean.getMsg();
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
if (mView != null) {
mView.updateCartsSuccess(s);
}
}
});
}
@Override
public void deleteCart(String uid, String pid, String token) {
deleteCartApi.deleteCart(uid, pid, token)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map(new Function<BaseBean, String>() {
@Override
public String apply(BaseBean baseBean) throws Exception {
return baseBean.getMsg();
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
if (mView != null) {
mView.updateCartsSuccess(s);
}
}
});
}
/**
* 判断该商家下面的商品是否全选
*
* @return
*/
private boolean isSellerProductAllSelect(GetCartsBean.DataBean dataBean) {
//获取该商家下面的所有商品
List<GetCartsBean.DataBean.ListBean> list = dataBean.getList();
for (int i = 0; i < list.size(); i++) {
GetCartsBean.DataBean.ListBean listBean = list.get(i);
if (0 == listBean.getSelected()) {
//如果是0的话,表示有一个商品未选中
return false;
}
}
return true;
}
}
ShopContract
public interface ShopContract {
interface View extends BaseContract.BaseView {
void showCartList(List<SellerBean> groupList, List<List<GetCartsBean.DataBean.ListBean>> childList);
void updateCartsSuccess(String msg);
void deleteCartSuccess(String msg);
}
interface Presenter extends BaseContract.BasePresenter<View> {
void getCarts(String uid, String token);
void updateCarts(String uid, String sellerid, String pid, String num, String selected, String token);
void deleteCart(String uid, String pid, String token);
}
}
适配器
public class ShopCartAdapter extends BaseExpandableListAdapter {
private Context context;
private List<SellerBean> groupList;
private List<List<GetCartsBean.DataBean.ListBean>> childList;
private LayoutInflater inflater;
private ProgressDialog progressDialog;
private ShopCartPresenter shopcartPresenter;
private final String uid;
private final String token;
private static final int CLICK_PRODUCT = 0;
private static final int CLICK_SELLER = 1;
private static final int CLICK_ALL = 2;
private static int state = 0;
private int cIndex = 0;//商家下商品的下标
private int gIndex = 0;//点击的商家下标
private int selected;
public ShopCartAdapter(Context context, List<SellerBean> groupList, List<List<GetCartsBean.DataBean.ListBean>> childList, ProgressDialog progressDialog, ShopCartPresenter shopcartPresenter) {
this.context = context;
this.groupList = groupList;
this.childList = childList;
this.progressDialog = progressDialog;
this.shopcartPresenter = shopcartPresenter;
inflater = LayoutInflater.from(context);
uid = (String) SharedPreferencesUtils.getParam(context, "uid", "1235");
token = (String) SharedPreferencesUtils.getParam(context, "token", "5B5E60DC8960BA6DBCF3CBA638A1EC32");
}
@Override
public int getGroupCount() {
return groupList.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return childList.get(groupPosition).size();
}
@Override
public Object getGroup(int groupPosition) {
return groupList.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return childList.get(groupPosition).get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
final GroupViewHolder groupViewHolder;
if (convertView == null) {
groupViewHolder = new GroupViewHolder();
convertView = inflater.inflate(R.layout.shopcart_seller_item, null);
groupViewHolder.cbSeller = convertView.findViewById(R.id.cbSeller);
groupViewHolder.tvSeller = convertView.findViewById(R.id.tvSeller);
convertView.setTag(groupViewHolder);
} else {
groupViewHolder = (GroupViewHolder) convertView.getTag();
}
final SellerBean sellerBean = groupList.get(groupPosition);
groupViewHolder.cbSeller.setChecked(sellerBean.isSelected());
groupViewHolder.tvSeller.setText(sellerBean.getSellerName());
//给商家的checkbox设置点击事件
groupViewHolder.cbSeller.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
state = CLICK_SELLER;
gIndex = groupPosition;
//显示进度条
progressDialog.show();
GetCartsBean.DataBean.ListBean listBean = childList.get(groupPosition).get(cIndex);
int pid = listBean.getPid();
int num = listBean.getNum();
selected = groupViewHolder.cbSeller.isChecked() ? 1 : 0;
shopcartPresenter.updateCarts(uid, sellerBean.getSellerid() + "", pid + "", num + "", selected + "",
token);
}
});
return convertView;
}
@Override
public View getChildView(final int groupPosition, int childPosition, boolean isLastChild, View convertView,
ViewGroup
parent) {
final ChildViewHolder childViewHolder;
if (convertView == null) {
childViewHolder = new ChildViewHolder();
convertView = inflater.inflate(R.layout.shopcart_seller_product_item, null);
childViewHolder.cbProduct = convertView.findViewById(R.id.cbProduct);
childViewHolder.iv = convertView.findViewById(R.id.iv);
childViewHolder.tvTitle = convertView.findViewById(R.id.tvTitle);
childViewHolder.tvPrice = convertView.findViewById(R.id.tvPrice);
childViewHolder.tvDel = convertView.findViewById(R.id.tvDel);
childViewHolder.addSubView = convertView.findViewById(R.id.addSubCard);
convertView.setTag(childViewHolder);
} else {
childViewHolder = (ChildViewHolder) convertView.getTag();
}
final GetCartsBean.DataBean.ListBean listBean = childList.get(groupPosition).get(childPosition);
childViewHolder.cbProduct.setChecked(listBean.getSelected() == 1 ? true : false);
childViewHolder.tvTitle.setText(listBean.getTitle());
childViewHolder.tvPrice.setText(listBean.getPrice() + "");
Glide.with(context).load(listBean.getImages().split("\\|")[0]).into(childViewHolder.iv);
childViewHolder.addSubView.setNum(listBean.getNum() + "");
//给二级列表的checkbox设置点击事件
childViewHolder.cbProduct.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
state = CLICK_PRODUCT;
//更新购物车
SellerBean sellerBean = groupList.get(groupPosition);
String sellerid = sellerBean.getSellerid();
int pid = listBean.getPid();
int num = listBean.getNum();
int selected = childViewHolder.cbProduct.isChecked() ? 1 : 0;
progressDialog.show();
shopcartPresenter.updateCarts(uid, sellerid, pid + "", num + "", selected + "", token);
}
});
//给减号设置点击事件
childViewHolder.addSubView.setSubOnclickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
state = CLICK_PRODUCT;
//先获取原先的数量
int num = listBean.getNum();
if (num == 1) {
Toast.makeText(context, "数量不能小于1", Toast.LENGTH_SHORT).show();
return;
}
num--;
//去更新购物车
SellerBean sellerBean = groupList.get(groupPosition);
String sellerid = sellerBean.getSellerid();
int pid = listBean.getPid();
int selected = childViewHolder.cbProduct.isChecked() ? 1 : 0;
progressDialog.show();
shopcartPresenter.updateCarts(uid, sellerid, pid + "", num + "", selected + "", token);
}
});
//给加号设置点击事件
childViewHolder.addSubView.setAddOnclickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
state = CLICK_PRODUCT;
//先获取原先的数量
int num = listBean.getNum();
num++;
//去更新购物车
SellerBean sellerBean = groupList.get(groupPosition);
String sellerid = sellerBean.getSellerid();
int pid = listBean.getPid();
int selected = childViewHolder.cbProduct.isChecked() ? 1 : 0;
progressDialog.show();
shopcartPresenter.updateCarts(uid, sellerid, pid + "", num + "", selected + "", token);
}
});
//给删除设置点击事件
childViewHolder.tvDel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
state = CLICK_PRODUCT;
//去删除购物车
int pid = listBean.getPid();
shopcartPresenter.deleteCart(uid, pid + "", token);
}
});
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
class GroupViewHolder {
CheckBox cbSeller;
TextView tvSeller;
}
class ChildViewHolder {
CheckBox cbProduct;
ImageView iv;
TextView tvTitle;
TextView tvPrice;
TextView tvDel;
AddSubView addSubView;
}
/**
* 更新购物车成功后走的方法
*/
public void updateSuceess() {
progressDialog.dismiss();
if (state == CLICK_PRODUCT) {
shopcartPresenter.getCarts(uid, token);
} else if (state == CLICK_SELLER) {
//判断该商家下是否还有别的商品,如果有则继续更新
cIndex++;
//获取该商家下的商品列表个数
int pCount = childList.get(gIndex).size();
if (cIndex >= pCount) {
//该商家下的商品已经遍历完成
cIndex = 0;
shopcartPresenter.getCarts(uid, token);
} else {
//接着更新该商家下的其它商品
SellerBean sellerBean = groupList.get(gIndex);
String sellerid = sellerBean.getSellerid();
GetCartsBean.DataBean.ListBean listBean = childList.get(gIndex).get(cIndex);
int pid = listBean.getPid();
int num = listBean.getNum();
shopcartPresenter.updateCarts(uid, sellerid + "", pid + "", num + "", selected + "", token);
}
} else if (state == CLICK_ALL) {
//先更新该商家下的商品
cIndex++;
if (cIndex >= childList.get(gIndex).size()) {
//该商家下的商品已经更新完成
cIndex = 0;
gIndex++;
if (gIndex >= groupList.size()) {
//所有商家都已更新完成
//重新获取购物车列表
shopcartPresenter.getCarts(uid, token);
return;
}
//接着更新该商家下的其它商品
SellerBean sellerBean = groupList.get(gIndex);
String sellerid = sellerBean.getSellerid();
GetCartsBean.DataBean.ListBean listBean = childList.get(gIndex).get(cIndex);
int pid = listBean.getPid();
int num = listBean.getNum();
shopcartPresenter.updateCarts(uid, sellerid + "", pid + "", num + "", selected + "", token);
} else {
//接着更新该商家下的其它商品
SellerBean sellerBean = groupList.get(gIndex);
String sellerid = sellerBean.getSellerid();
GetCartsBean.DataBean.ListBean listBean = childList.get(gIndex).get(cIndex);
int pid = listBean.getPid();
int num = listBean.getNum();
shopcartPresenter.updateCarts(uid, sellerid + "", pid + "", num + "", selected + "", token);
}
}
}
/**
* 遍历所有商家,判断是否都选中
*
* @return
*/
public boolean isAllSelected() {
for (int i = 0; i < groupList.size(); i++) {
if (!groupList.get(i).isSelected()) {
return false;
}
}
return true;
}
public void changAllState(boolean bool) {
progressDialog.show();
state = CLICK_ALL;
gIndex = 0;
cIndex = 0;
selected = bool ? 1 : 0;
SellerBean sellerBean = groupList.get(gIndex);
String sellerid = sellerBean.getSellerid();
GetCartsBean.DataBean.ListBean listBean = childList.get(gIndex).get(cIndex);
int pid = listBean.getPid();
int num = listBean.getNum();
shopcartPresenter.updateCarts(uid, sellerid, pid + "", num + "", selected + "", token);
}
public String[] getMoneyAndCount() {
double money = 0;
int count = 0;
for (int i = 0; i < groupList.size(); i++) {
for (int j = 0; j < childList.get(i).size(); j++) {
GetCartsBean.DataBean.ListBean listBean = childList.get(i).get(j);
if (listBean.getSelected() == 1) {
count += listBean.getNum();
money += listBean.getPrice() * listBean.getNum();
}
}
}
return new String[]{money + "", count + ""};
}
}
MainActivity
public class MainActivity extends BaseActivity<ShopCartPresenter> implements ShopContract.View {
private ExpandableListView mElv;
/**
* 全选
*/
private CheckBox mCbAll;
/**
* 合计:
*/
private TextView mTvMoney;
/**
* 去结算:
*/
private TextView mTvTotal;
private ProgressDialog progressDialog;
private ShopCartAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//请求购物车接口
mPresenter.getCarts(getUid(), getToken());
progressDialog = DialogUtil.getProgressDialog(this);
}
private void initView() {
mElv = (ExpandableListView) findViewById(R.id.elv);
mCbAll = (CheckBox) findViewById(R.id.cbAll);
mTvMoney = (TextView) findViewById(R.id.tvMoney);
mTvTotal = (TextView) findViewById(R.id.tvTotal);
mCbAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (adapter != null) {
adapter.changAllState(mCbAll.isChecked());
}
}
});
}
@Override
public int getContentLayout() {
return R.layout.activity_main;
}
@Override
public void inject() {
DaggerHttpComponent.builder()
.build()
.inject(this);
}
@Override
public void showCartList(List<SellerBean> groupList, List<List<GetCartsBean.DataBean.ListBean>> childList) {
adapter = new ShopCartAdapter(this, groupList, childList, progressDialog,
mPresenter);
//判断所有商家是否都选中,如果都选中则把全选设置为true
if (adapter != null) {
mCbAll.setChecked(adapter.isAllSelected());
}
mElv.setAdapter(adapter);
//展开列表
for (int i = 0; i < groupList.size(); i++) {
mElv.expandGroup(i);
}
if (adapter != null) {
String[] moneyAndCount = adapter.getMoneyAndCount();
mTvMoney.setText("总计:" + moneyAndCount[0] + "元");
mTvTotal.setText("总共(" + moneyAndCount[1] + ")个");
}
}
@Override
public void updateCartsSuccess(String msg) {
if (adapter != null) {
adapter.updateSuceess();
}
}
@Override
public void deleteCartSuccess(String msg) {
}
}