依赖:
compile 'com.squareup.okhttp3:okhttp:3.9.0' compile 'com.google.code.gson:gson:2.8.2' compile 'com.github.bumptech.glide:glide:3.7.0' compile 'org.greenrobot:eventbus:3.1.1' 接口:item_parent_market.xml购物车接口:http://120.27.23.105/product/getCarts?uid=100&source=android
添加属性 Bean文件中,一级列表和二级列表的选中状态private boolean checked;private boolean child;
activity_main.xml<?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="bwie.com.shopping_cart.MainActivity"> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:text="购物车" android:textColor="#ff3660" android:textSize="25sp" /> <ExpandableListView android:id="@+id/elv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="50dp" android:layout_alignParentBottom="true" android:background="@android:color/white" android:gravity="center_vertical"> <CheckBox android:id="@+id/checkbox2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:focusable="false" /> <TextView android:layout_width="wrap_content" android:layout_height="50dp" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:layout_toRightOf="@+id/checkbox2" android:gravity="center_vertical" android:text="全选" android:textSize="20sp" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="合计 :" /> <TextView android:id="@+id/tv_price" android:layout_width="wrap_content" android:layout_height="50dp" android:layout_marginLeft="10dp" android:paddingRight="10dp" android:text="0" android:textColor="@android:color/holo_red_light" /> <TextView android:id="@+id/tv_num" android:layout_width="wrap_content" android:layout_height="50dp" android:background="@android:color/holo_red_dark" android:gravity="center" android:padding="10dp" android:text="结算(0)" android:textColor="@android:color/white" /> </LinearLayout> </RelativeLayout> </LinearLayout>
item_child_market.xml<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="20dp" android:orientation="horizontal" android:gravity="center" android:layout_alignParentTop="true" android:layout_alignParentEnd="true"> <CheckBox android:id="@+id/cb_child" android:layout_width="wrap_content" android:layout_height="wrap_content" android:focusable="false" /> <ImageView android:id="@+id/img_icon" android:layout_width="100dp" android:layout_height="100dp" android:src="@mipmap/ic_launcher" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:orientation="vertical"> <TextView android:id="@+id/tv_tel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:textStyle="bold" android:singleLine="true" android:text="iphone6" /> <TextView android:id="@+id/tv_pri" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:textSize="18sp" android:text="¥3000.00" android:textColor="#f00" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:gravity="center_vertical"> <ImageView android:id="@+id/iv_del" android:layout_width="25dp" android:layout_height="25dp" android:src="@drawable/jian" /> <TextView android:id="@+id/tv_num" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:background="#00ff44" android:paddingBottom="2dp" android:paddingLeft="20dp" android:paddingRight="20dp" android:paddingTop="2dp" android:text="1" android:textSize="20sp" /> <ImageView android:id="@+id/iv_add" android:layout_width="25dp" android:layout_height="25dp" android:layout_marginLeft="5dp" android:src="@drawable/jia" /> </LinearLayout> </LinearLayout> </LinearLayout> <TextView android:id="@+id/tv_del" android:layout_width="40dp" android:layout_height="40dp" android:text="删除" android:background="#ffdd00" android:layout_alignParentRight="true" android:layout_marginRight="10dp" android:layout_marginTop="25dp" android:layout_centerVertical="true" android:gravity="center" /> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:gravity="center_vertical" android:orientation="horizontal" android:layout_height="wrap_content"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/white" > <CheckBox android:id="@+id/cb_parent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:layout_marginRight="4dp" android:checkMark="?android:attr/listChoiceIndicatorMultiple" android:gravity="center" android:minHeight="38dp" android:minWidth="32dp" android:textAppearance="?android:attr/textAppearanceLarge" android:visibility="visible" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginLeft="50dp"> <ImageView android:layout_width="40dp" android:layout_height="40dp" android:src="@drawable/shichang" android:layout_gravity="center"/> <TextView android:id="@+id/tv_number" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginBottom="10dp" android:layout_marginTop="10dp" android:layout_toRightOf="@id/cb_parent" android:background="@android:color/white" android:drawablePadding="10dp" android:text="第八号当铺" android:textColor="#666666" android:textSize="18sp" /> <ImageView android:id="@+id/imageView" android:layout_width="40dp" android:layout_height="40dp" android:layout_gravity="center" android:src="@drawable/fanhui" /> </LinearLayout> <Button android:id="@+id/tv_store_edtor" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="4dp" android:background="@null" android:text="编辑" android:textSize="18sp" /> </RelativeLayout> </LinearLayout>
GsonUtils
package bwie.com.shopping_cart.HttpUtlis; import com.google.gson.Gson; /** * Created by 高俊生 on 2017/12/15. */ public class GsonUtils { // 请求成功之后做解析,通过自己的回调接口将数据返回回去 //Gson解析数据,并等着被调用返回 private static Gson instance; private GsonUtils(){} public static Gson getInstance(){ if (instance == null){ instance = new Gson(); } return instance; } }
HttpUtils
package bwie.com.shopping_cart.HttpUtlis; import android.os.Handler; import android.text.TextUtils; import android.util.Log; import java.io.IOException; import java.util.Map; import bwie.com.shopping_cart.CallBack.CallBack; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; /** * Created by 高俊生 on 2017/12/15. */ public class HttpUtils { private static final String TAG = "HttpUtils"; private static volatile HttpUtils instence; //创建一个Handler private static Handler handler = new Handler(); public HttpUtils(){ } //单例模式 public static HttpUtils getInstence(){ if (null == instence){ synchronized (HttpUtils.class){ if (instence == null){ instence = new HttpUtils(); } } } return instence; } // /** // * Get请求 // * // * @param url // * @param map // * @param callBack // * @param cls // * @param tag // */ //请求数据 public void get(String url, Map<String,String> map, final CallBack callBack,final Class cls,final String tag){ if (TextUtils.isEmpty(url)){ return; } //字符串变量,它的对象是可以扩充和修改的。 StringBuffer sb = new StringBuffer(); sb.append(url); //--------------------3种类型的字符串----------------------------------- // http://www.baoidu.com/login?mobile=11111&password=11111&age=1&name=zw // 1.http://www.baoidu.com/login --------? key=value&key=value // 2.http://www.baoidu.com/login? --------- key=value&key=value // 3.http://www.baoidu.com/login?mobile=11111 -----&key=value&key=value // 如果包含?说明是2.3类型 //contains:包含 if (url.contains("?")) { // 如果包含?并且?是最后一位,对应是2类型 if (url.indexOf("?") == url.length() - 1){ }else { // 如果包含?并且?不是最后一位,对应是3类型 sb.append("&"); } }else { //不包含?,对应的1类型 sb.append("?"); } // 遍历map集合进行拼接,拼接的形式是 key=value& for (Map.Entry<String ,String> entry : map.entrySet()){ sb.append(entry.getKey()) .append("=") .append(entry.getValue()) .append("&"); } // 如果存在&号,把最后一个&去掉 if (sb.indexOf("&") != -1){ sb.deleteCharAt(sb.lastIndexOf("&")); } //打印一下接口 Log.i(TAG,"++++++++++get url:" +sb); OkHttpClient client = new OkHttpClient(); //对象是有关于客户端所发出的请求的对象,只要是有关于客户端请求的信息,都可以藉由它来取得 final Request request = new Request.Builder() .get() .url(sb.toString()) .build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { handler.post(new Runnable() { @Override public void run() { // 通过自己传进来的回调接口对象回传回去 callBack.onFailed(tag,e); } }); } @Override public void onResponse(Call call, Response response) throws IOException { final String result = response.body().string(); // 请求成功之后做解析,通过自己的回调接口将数据返回回去 handler.post(new Runnable() { @Override public void run() { Object o; if (TextUtils.isEmpty(result)){ o = null; }else { o = GsonUtils.getInstance().fromJson(result,cls); } callBack.onSeccess(tag,o); } }); } }); } }
MessageEvent
package bwie.com.shopping_cart.EventBus; /** * Created by 高俊生 on 2017/12/15. */ public class MessageEvent { private boolean checked; //判断 public boolean isChecked(){ return checked; } public void setChecked(boolean checked){ this.checked = checked; } }
PriceAndCountEvent
package bwie.com.shopping_cart.EventBus; /** * Created by 高俊生 on 2017/12/15. */ public class PriceAndCountEvent { //创建两个变量,价格和数量 private int price; private int count; public int getPrice() { return price; } public int getCount() { return count; } public void setPrice(int price) { this.price = price; } public void setCount(int count) { this.count = count; } }
CallBack
package bwie.com.shopping_cart.CallBack; /** * Created by 高俊生 on 2017/12/15. */ public interface CallBack { void onFailed(String tag,Exception e); void onSeccess(String tag,Object o); }
CartCallBack
package bwie.com.shopping_cart.CallBack; import java.util.List; import bwie.com.shopping_cart.Bean.CartBean; /** * Created by 高俊生 on 2017/12/15. */ public interface CartCallBack { void seccess(String tsg, List<CartBean.DataBean> news);//一级列表商家全部信息 void failed(String tab,Exception e); }
CartBean//可自己读取Bean包package bwie.com.shopping_cart.Bean; import java.util.List; /** * Created by 高俊生 on 2017/12/15. */ public class CartBean { /** * msg : 请求成功 * code : 0 * data : [{"list":[{"bargainPrice":11800,"createtime":"2017-10-10T17:33:37","detailUrl":"https://item.m.jd.com/product/4338107.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!q70.jpg","num":4,"pid":57,"price":5199,"pscid":40,"selected":0,"sellerid":1,"subhead":"【i5 MX150 2G显存】全高清窄边框 8G内存 256固态硬盘 支持指纹识别 预装WIN10系统","title":"小米(MI)Air 13.3英寸全金属轻薄笔记本(i5-7200U 8G 256G PCle SSD MX150 2G独显 FHD 指纹识别 Win10)银\r\n"}],"sellerName":"商家1","sellerid":"1"},{"list":[{"bargainPrice":5599,"createtime":"2017-10-10T17:30:32","detailUrl":"https://item.m.jd.com/product/4824715.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n12/jfs/t7768/184/1153704394/148460/f42e1432/599a930fN8a85626b.jpg!q70.jpg","num":2,"pid":59,"price":5599,"pscid":40,"selected":0,"sellerid":3,"subhead":"游戏本选择4G独显,拒绝掉帧】升级版IPS全高清防眩光显示屏,WASD方向键颜色加持,三大出风口立体散热!","title":"戴尔DELL灵越游匣15PR-6648B GTX1050 15.6英寸游戏笔记本电脑(i5-7300HQ 8G 128GSSD+1T 4G独显 IPS)黑"}],"sellerName":"商家3","sellerid":"3"},{"list":[{"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":0,"sellerid":4,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)","title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"}],"sellerName":"商家4","sellerid":"4"},{"list":[{"bargainPrice":11800,"createtime":"2017-10-03T23:43:53","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":64,"price":11000,"pscid":40,"selected":0,"sellerid":8,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)","title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"}],"sellerName":"商家8","sellerid":"8"}] */ 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":11800,"createtime":"2017-10-10T17:33:37","detailUrl":"https://item.m.jd.com/product/4338107.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!q70.jpg","num":4,"pid":57,"price":5199,"pscid":40,"selected":0,"sellerid":1,"subhead":"【i5 MX150 2G显存】全高清窄边框 8G内存 256固态硬盘 支持指纹识别 预装WIN10系统","title":"小米(MI)Air 13.3英寸全金属轻薄笔记本(i5-7200U 8G 256G PCle SSD MX150 2G独显 FHD 指纹识别 Win10)银\r\n"}] * sellerName : 商家1 * sellerid : 1 */ private String sellerName; private String sellerid; private List<ListBean> list; private boolean checked; public boolean isChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; } 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 : 11800.0 * createtime : 2017-10-10T17:33:37 * detailUrl : https://item.m.jd.com/product/4338107.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!q70.jpg * num : 4 * pid : 57 * price : 5199.0 * pscid : 40 * selected : 0 * sellerid : 1 * subhead : 【i5 MX150 2G显存】全高清窄边框 8G内存 256固态硬盘 支持指纹识别 预装WIN10系统 * title : 小米(MI)Air 13.3英寸全金属轻薄笔记本(i5-7200U 8G 256G PCle SSD MX150 2G独显 FHD 指纹识别 Win10)银 */ 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; private boolean child; public boolean isChild() { return child; } public void setChild(boolean child) { this.child = child; } 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; } } } }CartPresenter
package bwie.com.shopping_cart.Presenter; import android.util.Log; import java.util.HashMap; import java.util.List; import java.util.Map; import bwie.com.shopping_cart.Bean.CartBean; import bwie.com.shopping_cart.CallBack.CallBack; import bwie.com.shopping_cart.CallBack.CartCallBack; import bwie.com.shopping_cart.HttpUtlis.HttpUtils; /** * Created by 高俊生 on 2017/12/15. */ public class CartPresenter { private CartCallBack inv; public CartPresenter(CartCallBack inv) { this.inv = inv; } public void getNews(){ //type=top&key=dbedecbcd1899c9785b95cc2d17131c5 Map<String ,String> map = new HashMap<>(); // map.put("cid", "1"); // map.put("key", "dbedecbcd1899c9785b95cc2d17131c5"); HttpUtils.getInstence().get("http://120.27.23.105/product/getCarts?uid=100&source=android", map, new CallBack() { @Override public void onFailed(String tag, Exception e) { inv.failed(tag,e); } @Override public void onSeccess(String tag, Object o) { CartBean bean = (CartBean) o; Log.v("tag",bean.getMsg()); if (bean != null){ List<CartBean.DataBean> data = bean.getData(); inv.seccess(tag,data); Log.i("zzzzzzzzzzzzzz","onSeccess()内容;" + data.toString()); } } },CartBean.class, "news"); } //释放占用 public void detachView(){ if (inv != null){ inv =null; } } }
MyAdapter
package bwie.com.shopping_cart.Adapter; import android.content.Context; import android.content.DialogInterface; import android.support.v7.app.AlertDialog; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import org.greenrobot.eventbus.EventBus; import java.util.List; import bwie.com.shopping_cart.Bean.CartBean; import bwie.com.shopping_cart.EventBus.PriceAndCountEvent; import bwie.com.shopping_cart.R; /** * Created by 高俊生 on 2017/12/15. */ public class MyAdapter extends BaseExpandableListAdapter{ private Context context; private List<CartBean.DataBean> list;//父类集合 public MyAdapter(Context context, List<CartBean.DataBean> list) { this.context = context; this.list = list; } @Override public int getGroupCount() { return list.size(); } @Override public int getChildrenCount(int i) { return list.get(i).getList().size(); } @Override public Object getGroup(int i) { return list.get(i); } @Override public Object getChild(int i, int i1) { return list.get(i).getList().get(i1); } @Override public long getGroupId(int i) { return i; } @Override public long getChildId(int i, int i1) { return i1; } @Override public boolean hasStableIds() { return false; } @Override public View getGroupView(final int i, boolean b, View view, ViewGroup viewGroup) { final GroupViewHolder holder; if (view == null) { holder = new GroupViewHolder(); view = view.inflate(context, R.layout.item_parent_market, null); holder.cbGroup = (CheckBox) view.findViewById(R.id.cb_parent); holder.tv_number = (TextView) view.findViewById(R.id.tv_number); view.setTag(holder); } else { holder = (GroupViewHolder) view.getTag(); } final CartBean.DataBean dataBean = list.get(i); holder.cbGroup.setChecked(dataBean.isChecked()); holder.tv_number.setText(dataBean.getSellerName()); //一级列表复选框点击按钮 holder.cbGroup.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //点击改变状态值 dataBean.setChecked(holder.cbGroup.isChecked()); //通过一级的是否勾选,改变二级CheckBox状态 changeChildCbState(i, holder.cbGroup.isChecked()); EventBus.getDefault().post(compute()); //通过判断是否全选,改变全选的状态 changeAllCbState(isAllGroupCbSelected()); notifyDataSetChanged(); } }); return view; } @Override public View getChildView(final int i, final int i1, boolean b, View view, ViewGroup viewGroup) { final ChildViewHolder holder; if (view == null) { holder = new ChildViewHolder(); view = view.inflate(context,R.layout.item_child_market, null); holder.cbChild = (CheckBox) view.findViewById(R.id.cb_child);//二级复选框 holder.tv_tel = (TextView) view.findViewById(R.id.tv_tel);//简介 holder.imgIcon = (ImageView) view.findViewById(R.id.img_icon);//图片 holder.tv_price = (TextView) view.findViewById(R.id.tv_pri);//价格 holder.tv_del = (TextView) view.findViewById(R.id.tv_del);//减 holder.iv_del = (ImageView) view.findViewById(R.id.iv_del); holder.iv_add = (ImageView) view.findViewById(R.id.iv_add);//加 holder.tv_num = (TextView) view.findViewById(R.id.tv_num);//加减器 view.setTag(holder); } else { holder = (ChildViewHolder) view.getTag(); } final CartBean.DataBean.ListBean datasBean = list.get(i).getList().get(i1); //---------------------------------------------------------------------------------------- holder.cbChild.setChecked(datasBean.isChild()); holder.tv_tel.setText(datasBean.getTitle()); holder.tv_price.setText("¥"+datasBean.getPrice() ); holder.tv_num.setText(datasBean.getNum() + ""); String images = datasBean.getImages().trim(); String[] split = images.split("[|]"); Glide.with(context).load(split[0]).into(holder.imgIcon); //二级checkbox holder.cbChild.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //设置该条目对象里的checked属性值 datasBean.setChild(holder.cbChild.isChecked()); PriceAndCountEvent priceAndCountEvent = compute(); EventBus.getDefault().post(priceAndCountEvent); if (holder.cbChild.isChecked()) { //当前checkbox是选中状态 if (isAllChildCbSelected(i)) { changGroupCbState(i, true); changeAllCbState(isAllGroupCbSelected()); } } else { changGroupCbState(i, false); changeAllCbState(isAllGroupCbSelected()); } notifyDataSetChanged(); } }); //减号 holder.iv_del.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int num = datasBean.getNum(); if (num == 1) { return; } //给控件赋值 holder.tv_num.setText(--num + ""); //给控件赋值以后在赋值给控件本身 datasBean.setNum(num); //当点击选中Checkbox的时候 if (holder.cbChild.isChecked()) { //进行计算赋值传递给主MainActivity进行显示 EventBus.getDefault().postSticky(compute()); } notifyDataSetChanged(); } }); //加号 holder.iv_add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int num = datasBean.getNum(); holder.tv_num.setText(++num + ""); datasBean.setNum(num); if (holder.cbChild.isChecked()) { EventBus.getDefault().post(compute()); } } }); //删除 holder.tv_del.setOnClickListener(new View.OnClickListener() { private AlertDialog dialog; @Override public void onClick(View v) { final List<CartBean.DataBean.ListBean> datasBeen = list.get(i).getList(); AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("提示"); builder.setMessage("确认是否删除?"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int ii) { datasBeen.remove(i1); list.remove(i); EventBus.getDefault().post(compute()); notifyDataSetChanged(); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { dialog.dismiss(); } }); dialog = builder.create(); dialog.show(); } }); return view; } @Override public boolean isChildSelectable(int i, int i1) { return false; } class GroupViewHolder { CheckBox cbGroup; TextView tv_number; } class ChildViewHolder { CheckBox cbChild; TextView tv_tel; ImageView imgIcon; TextView tv_price; TextView tv_del; ImageView iv_del; ImageView iv_add; TextView tv_num; } /** * 改变全选的状态 * * @param flag */ private void changeAllCbState(boolean flag) { // MessageEvent messageEvent = new MessageEvent(); // messageEvent.setChecked(flag); // EventBus.getDefault().post(messageEvent); EventBus.getDefault().postSticky(flag);//将获取的布尔值发送出去 } /** * 改变一级列表checkbox状态 * * @param groupPosition */ private void changGroupCbState(int groupPosition, boolean flag) { CartBean.DataBean dataBean = list.get(groupPosition); dataBean.setChecked(flag); } /** * 改变二级列表checkbox状态 * * @param groupPosition * @param flag */ private void changeChildCbState(int groupPosition, boolean flag) { List<CartBean.DataBean.ListBean> datasBeen = this.list.get(groupPosition).getList(); for (int j = 0; j < datasBeen.size(); j++) { datasBeen.get(j).setChild(flag); } } /** * 判断一级列表是否全部选中 * * @return */ private boolean isAllGroupCbSelected() { for (int i = 0; i < list.size(); i++) { boolean b = list.get(i).isChecked(); if (b) { return false; } } return true; } /** * 判断二级列表是否全部选中 * * @param groupPosition * @return */ private boolean isAllChildCbSelected(int groupPosition) { List<CartBean.DataBean.ListBean> datasBeen = list.get(groupPosition).getList(); for (int i = 0; i < datasBeen.size(); i++) { CartBean.DataBean.ListBean datasBean = datasBeen.get(i); if (!datasBean.isChild()) { return false; } } return true; } /** * 计算列表中,选中的钱和数量 */ private PriceAndCountEvent compute() { int count = 0; int price = 0; for (int i = 0; i < list.size(); i++) { CartBean.DataBean datasBeen = list.get(i); List<CartBean.DataBean.ListBean> datas = datasBeen.getList(); for (int j = 0; j < datas.size(); j++) { CartBean.DataBean.ListBean datasBean = datas.get(j); if (datasBean.isChild()) { price += datasBean.getNum() * datasBean.getPrice(); count += datasBean.getNum(); } } } PriceAndCountEvent priceAndCountEvent = new PriceAndCountEvent(); priceAndCountEvent.setCount(count); priceAndCountEvent.setPrice(price); return priceAndCountEvent; } /** * 设置全选、反选 * * @param flag */ public void changeAllListCbState(boolean flag) { for (int i = 0; i < list.size(); i++) { CartBean.DataBean dataBean = list.get(i); dataBean.setChecked(flag); List<CartBean.DataBean.ListBean> datas = dataBean.getList(); for (int j = 0; j < datas.size(); j++) { CartBean.DataBean.ListBean listBean = datas.get(j); listBean.setChild(flag); } } EventBus.getDefault().post(compute()); notifyDataSetChanged(); } }
MainActivity
package bwie.com.shopping_cart; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.CheckBox; import android.widget.ExpandableListView; import android.widget.TextView; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import java.util.ArrayList; import java.util.List; import bwie.com.shopping_cart.Adapter.MyAdapter; import bwie.com.shopping_cart.Bean.CartBean; import bwie.com.shopping_cart.CallBack.CartCallBack; import bwie.com.shopping_cart.EventBus.MessageEvent; import bwie.com.shopping_cart.EventBus.PriceAndCountEvent; import bwie.com.shopping_cart.Presenter.CartPresenter; public class MainActivity extends AppCompatActivity implements CartCallBack{ private List<CartBean.DataBean> groupList = new ArrayList<>(); private ExpandableListView mElv; private CheckBox mCheckbox2; /** * 0 */ private TextView mTvPrice; /** * 结算(0) */ private TextView mTvNum; private MyAdapter adapter; private CartPresenter presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); presenter = new CartPresenter(this); presenter.getNews(); adapter = new MyAdapter(this,groupList); mElv.setAdapter(adapter); mCheckbox2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { adapter.changeAllListCbState(mCheckbox2.isChecked()); } }); } private void initView() { mElv = (ExpandableListView) findViewById(R.id.elv); mCheckbox2 = (CheckBox) findViewById(R.id.checkbox2); mTvPrice = (TextView) findViewById(R.id.tv_price); mTvNum = (TextView) findViewById(R.id.tv_num); } @Override public void seccess(String tsg, List<CartBean.DataBean> news) { groupList.addAll(news); Log.v("tag",news.get(1).getSellerName()+"hgfh"); for (int i = 0; i < news.size(); i++) { final CartBean.DataBean dataBean = news.get(i); List<CartBean.DataBean.ListBean> datas = news.get(i).getList(); // groupList.get(i).getList().add((CartBean.DataBean.ListBean) datas); } adapter.notifyDataSetChanged(); mElv.setGroupIndicator(null); for (int i=0;i<groupList.size();i++){ mElv.expandGroup(i); } } @Override public void failed(String tab, Exception e) { } @Override protected void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Subscribe public void onMessageEvent(MessageEvent event) { mCheckbox2.setChecked(event.isChecked()); } @Subscribe public void onMessageEvent(PriceAndCountEvent event) { mTvNum.setText("结算(" + event.getCount() + ")"); mTvPrice.setText("¥"+event.getPrice() ); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); if (presenter != null) { presenter.detachView(); } } }