需要的依赖
implementation 'com.squareup.okhttp3:okhttp:3.4.2'
implementation 'com.google.code.gson:gson:2.2.4'
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
.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"
tools:context=".MainActivity"
android:orientation="vertical">
<ExpandableListView
android:id="@+id/ex_listview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="9">
</ExpandableListView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#e9d7d7"
android:orientation="horizontal">
<CheckBox
android:id="@+id/ck_all"
android:text="全选"
android:textSize="18sp"
android:layout_gravity="center_vertical"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_zong"
android:text="合计:¥0.00"
android:textSize="20sp"
android:layout_gravity="center_vertical"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn_jiesuan"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="结算(0)"
android:textSize="20sp"
android:background="#7ec4c9"/>
</LinearLayout>
</LinearLayout>
.MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
String url = "http://www.zhaoapi.cn/product/getCarts";
private ExpandableListView ex_listview;
private CheckBox ck_all;
private TextView tv_zong;
private Button btn_jiesuan;
private MyAdapter ma;
private Presenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initView() {
ex_listview = findViewById(R.id.ex_listview);
ck_all = findViewById(R.id.ck_all);
tv_zong = findViewById(R.id.tv_zong);
btn_jiesuan = findViewById(R.id.btn_jiesuan);
btn_jiesuan.setOnClickListener(this);
ck_all.setOnClickListener(this);
}
private void initData() {
HashMap<String, String> map = new HashMap<>();
map.put("uid", "71");
Presenter presenter = new Presenter();
presenter.LhxPresenter(url, map, new Presenter.LhxInterface() {
@Override
public void success(List<Shop.DataBean> dataBeans) {
//得到含有具体数据的集合
ma = new MyAdapter(dataBeans);
ex_listview.setAdapter(ma);
//设置去掉默认向下的箭头
ex_listview.setGroupIndicator(null);
//直接展开二级列表
for (int i = 0; i < dataBeans.size(); i++) {
ex_listview.expandGroup(i);
}
ma.setOnShopChangeListener(new MyAdapter.onShopChangeListener() {
@Override
public void onCheckGroup(int groupPosition) {
//商家的点击
boolean allSelected = ma.isAllSelected(groupPosition);
ma.groupCheck(groupPosition, !allSelected);
ma.notifyDataSetChanged();
//刷新底部数据
refreshData();
}
@Override
public void onCheckChild(int groupPosition, int childPosition) {
//商品的点击
ma.childCheck(groupPosition, childPosition);
ma.notifyDataSetChanged();
//刷新底部数据
refreshData();
}
@Override
public void onAddSub(int groupPosition, int childPosition, int num) {
//加减的点击
ma.addsub(groupPosition, childPosition, num);
ma.notifyDataSetChanged();
//刷新底部数据
refreshData();
}
});
//刷新底部数据
refreshData();
}
@Override
public void failed() {
}
});
}
private void refreshData() {
//判断是否所有商品都被选中
boolean allAllSelected = ma.isAllAllSelected();
//设置给全选CheckBox
ck_all.setChecked(allAllSelected);
//计算总价
float shopPrice = ma.shopPrice();
tv_zong.setText("总价"+shopPrice);
//计算总数量
int shopNumber = ma.shopNumber();
btn_jiesuan.setText("结算("+shopNumber+")");
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_jiesuan:
Toast.makeText(this, "没有钱!", Toast.LENGTH_SHORT).show();
break;
case R.id.ck_all://底部全选按钮
//判断是否所有商品都被选中
boolean allAllSelected = ma.isAllAllSelected();
ma.shopCheck(!allAllSelected);
ma.notifyDataSetChanged();
refreshData();
break;
}
}
}
.MyAdapter
public class MyAdapter extends BaseExpandableListAdapter {
private List<Shop.DataBean> mDataBeans;
public MyAdapter(List<Shop.DataBean> dataBeans) {
mDataBeans = dataBeans;
}
//组的个数
@Override
public int getGroupCount() {
return mDataBeans == null ? 0 : mDataBeans.size();
}
//组里面的条目数
@Override
public int getChildrenCount(int groupPosition) {
return mDataBeans.get(groupPosition).getList() == null ? 0 : mDataBeans.get(groupPosition).getList().size();
}
//组的布局,相似于listview
@Override
public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
Shop.DataBean dataBean = mDataBeans.get(groupPosition);
ViewHolder vh;
if (convertView == null) {
convertView = View.inflate(parent.getContext(), R.layout.groupitems, null);
vh = new ViewHolder(convertView);
convertView.setTag(vh);
} else {
vh = (ViewHolder) convertView.getTag();
}
vh.tv_name.setText(dataBean.getSellerName());
//根据当前商家的所有商品,确定商家的CheckBox是否选中
boolean allSelected = isAllSelected(groupPosition);
//根据这个Boolean判断是否选中
vh.ck_ck.setChecked(allSelected);
//设置点击CheckBox
vh.ck_ck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnShopChangeListener != null){
mOnShopChangeListener.onCheckGroup(groupPosition);
}
}
});
return convertView;
}
public static class ViewHolder {
public View rootView;
public CheckBox ck_ck;
public TextView tv_name;
public ViewHolder(View rootView) {
this.rootView = rootView;
this.ck_ck = (CheckBox) rootView.findViewById(R.id.ck_ck);
this.tv_name = (TextView) rootView.findViewById(R.id.tv_name);
}
}
//子条目的布局
@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
Shop.DataBean dataBean = mDataBeans.get(groupPosition);
List<Shop.DataBean.ListBean> list = dataBean.getList();
Shop.DataBean.ListBean listBean = list.get(childPosition);
ChildViewHolder childViewHolder;
if (convertView == null) {
convertView = View.inflate(parent.getContext(), R.layout.childitems, null);
childViewHolder = new ChildViewHolder(convertView);
convertView.setTag(childViewHolder);
} else {
childViewHolder = (ChildViewHolder) convertView.getTag();
}
//设置商品名字
childViewHolder.tv_childname.setText(listBean.getTitle());
//设置商品单价
childViewHolder.tv_childprice.setText(listBean.getPrice()+"");
//获取图片
String images = listBean.getImages();
String[] split = images.split("!");
//设置商品图片
ImageLoader.getInstance().displayImage(split[0],childViewHolder.iv1,ImageLoadfigs.getops(parent.getContext()));
//设置复选框是否选中
childViewHolder.ck_child.setChecked(listBean.getSelected() == 1);
//设置组合式自定义控件内部的数量
childViewHolder.add_remove_view.setNumber(listBean.getNum());
//checkbox的点击事件
childViewHolder.ck_child.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnShopChangeListener != null){
mOnShopChangeListener.onCheckChild(groupPosition, childPosition);
}
}
});
//加减的点击事件
childViewHolder.add_remove_view.setOnNumberChangeListener(new MyAddSubView.OnNumberChangeListener() {
@Override
public void onNumberChange(int num) {
if (mOnShopChangeListener != null){
mOnShopChangeListener.onAddSub(groupPosition, childPosition, num);
}
}
});
return convertView;
}
class ChildViewHolder {
public View rootView;
public CheckBox ck_child;
public ImageView iv1;
public TextView tv_childname;
public TextView tv_childprice;
public MyAddSubView add_remove_view;
public ChildViewHolder(View rootView) {
this.rootView = rootView;
this.ck_child = (CheckBox) rootView.findViewById(R.id.ck_child);
this.iv1 = (ImageView) rootView.findViewById(R.id.iv1);
this.tv_childname = (TextView) rootView.findViewById(R.id.tv_childname);
this.tv_childprice = (TextView) rootView.findViewById(R.id.tv_childprice);
this.add_remove_view = (MyAddSubView) rootView.findViewById(R.id.add_remove_view);
}
}
//判断当前商家所有商品是否被选中了(一种全都被选中,一种是没有全都选中)
public boolean isAllSelected(int groupPosition){
//拿到对应组的数据
Shop.DataBean dataBean = mDataBeans.get(groupPosition);
//拿到商家的所有数据,是一个集合
List<Shop.DataBean.ListBean> list = dataBean.getList();
for (Shop.DataBean.ListBean listBean :list){
//判断这个组的所有商品是否被全选中,如果有一个没有被选中,那么商家就是未选中状态
if (listBean.getSelected() == 0){
return false;
}
}
return true;
}
//底部的全选按钮,类似上边的
public boolean isAllAllSelected(){
for (int i = 0; i < mDataBeans.size(); i++) {
//拿到对应组的数据
Shop.DataBean dataBean = mDataBeans.get(i);
//拿到商家的所有数据,是一个集合
List<Shop.DataBean.ListBean> list = dataBean.getList();
for (int j = 0; j < list.size(); j++) {
//判断这个组的所有商品是否被全选中,如果有一个没有被选中,那么商家就是未选中状态
if (list.get(j).getSelected() == 0){
return false;
}
}
}
return true;
}
//计算商品总数量
public int shopNumber(){
int totalNumber = 0;
for (int i = 0; i < mDataBeans.size(); i++) {
//拿到对应组的数据
Shop.DataBean dataBean = mDataBeans.get(i);
//拿到商家的所有数据,是一个集合
List<Shop.DataBean.ListBean> list = dataBean.getList();
for (int j = 0; j < list.size(); j++) {
//只计算选中的
if (list.get(j).getSelected()==1){
//拿到商品数量
int num = list.get(j).getNum();
totalNumber += num;
}
}
}
return totalNumber;
}
//计算总价
public float shopPrice(){
float totalPrice = 0;
for (int i = 0; i < mDataBeans.size(); i++) {
//拿到对应组的数据
Shop.DataBean dataBean = mDataBeans.get(i);
//拿到商家的所有数据,是一个集合
List<Shop.DataBean.ListBean> list = dataBean.getList();
for (int j = 0; j < list.size(); j++) {
//只计算选中的
if (list.get(j).getSelected()==1){
//拿到商品数量 价钱
int num = list.get(j).getNum();
float price = (float) list.get(j).getPrice();
totalPrice += num*price;
}
}
}
return totalPrice;
}
//当商品组的全选框点击时,更新所有商品的状态
public void groupCheck(int groupPosition,boolean isSelected){
//拿到对应组的数据
Shop.DataBean dataBean = mDataBeans.get(groupPosition);
//拿到商家的所有数据,是一个集合
List<Shop.DataBean.ListBean> list = dataBean.getList();
for (int i = 0; i < list.size(); i++) {
Shop.DataBean.ListBean listBean = list.get(i);
listBean.setSelected(isSelected ? 1 : 0);
}
}
//当商家子条目的全选框选中时,更新其状态
public void childCheck(int groupPosition,int childPosition){
//拿到对应组的数据
Shop.DataBean dataBean = mDataBeans.get(groupPosition);
//拿到商家的所有数据,是一个集合
List<Shop.DataBean.ListBean> list = dataBean.getList();
Shop.DataBean.ListBean listBean = list.get(childPosition);
listBean.setSelected(listBean.getSelected() == 0 ? 1 : 0);
}
//设置所有商品的状态
public void shopCheck(boolean selected){
for (int i = 0; i < mDataBeans.size(); i++) {
//拿到对应组的数据
Shop.DataBean dataBean = mDataBeans.get(i);
//拿到商家的所有数据,是一个集合
List<Shop.DataBean.ListBean> list = dataBean.getList();
for (int j = 0; j < list.size(); j++) {
list.get(j).setSelected(selected ? 1 : 0);
}
}
}
//商品数量的加减
public void addsub(int groupPosition,int childPosition,int num){
//拿到对应组的数据
Shop.DataBean dataBean = mDataBeans.get(groupPosition);
//拿到商家的所有数据,是一个集合
List<Shop.DataBean.ListBean> list = dataBean.getList();
Shop.DataBean.ListBean listBean = list.get(childPosition);
listBean.setNum(num);
}
//接口回调
public interface onShopChangeListener{
//点击商家的check按钮
void onCheckGroup(int groupPosition);
//点击条目的check按钮
void onCheckChild(int groupPosition,int childPosition);
//点击加减
void onAddSub(int groupPosition,int childPosition,int num);
}
onShopChangeListener mOnShopChangeListener;
public void setOnShopChangeListener(onShopChangeListener onShopChangeListener) {
mOnShopChangeListener = onShopChangeListener;
}
//
@Override
public Object getGroup(int groupPosition) {
return null;
}
//
@Override
public Object getChild(int groupPosition, int childPosition) {
return null;
}
//
@Override
public long getGroupId(int groupPosition) {
return 0;
}
//
@Override
public long getChildId(int groupPosition, int childPosition) {
return 0;
}
//
@Override
public boolean hasStableIds() {
return false;
}
//
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
}
.presenter
public class Presenter {
public void LhxPresenter(String url, Map<String,String> map,final LhxInterface lhxInterface){
OkHttpUtil instance = OkHttpUtil.getInstance();
instance.doPost(url, map, new OkHttpUtil.OkCallback() {
@Override
public void onFailure(Exception e) {
}
@Override
public void onResponse(String json) {
Shop shop = new Gson().fromJson(json, Shop.class);
List<Shop.DataBean> dataBeans = shop.getData();
lhxInterface.success(dataBeans);
}
});
}
public interface LhxInterface{
void success(List<Shop.DataBean> dataBeans);
void failed();
}
}