1.查询购物车的p层
package com.example.jingdong.presenter;
import com.example.jingdong.bean.SellerBean;
import com.example.jingdong.bean.ShopCarBean;
import com.example.jingdong.model.GetShopCarModelImp;
import com.example.jingdong.net.OnNetListener;
import com.example.jingdong.ui.inter.GetShopCarView;
import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.List;
public class GetShopCarPresenterImp implements GetShopCarPresenter{
private GetShopCarView getShopCarView;
private final GetShopCarModelImp getShopCarModelImp;
public GetShopCarPresenterImp(GetShopCarView getShopCarView) {
this.getShopCarView=getShopCarView;
getShopCarModelImp = new GetShopCarModelImp();
}
@Override
public void getShopCar(String uid, String token) {
getShopCarModelImp.getShopCar(uid, token, new OnNetListener() {
@Override
public void onSuccess(String result) {
ShopCarBean shopCarBean = new Gson().fromJson(result, ShopCarBean.class);
if (getShopCarView!=null){
//用于封装一级列表
List<SellerBean> groupList = new ArrayList<>();
//用于封装二级列表
List<List<ShopCarBean.DataBean.ListBean>> childList = new ArrayList<>();
//获取数据
List<ShopCarBean.DataBean> data = shopCarBean.getData();
//循环获取数据
for (int i = 0; i < data.size(); i++) {
ShopCarBean.DataBean dataBean = data.get(i);
//添加父集合
SellerBean sellerBean = new SellerBean();
sellerBean.setSellerName(dataBean.getSellerName());
sellerBean.setSellerid(dataBean.getSellerid());
//设置是否全部选中
sellerBean.setSelected(isSellerProductAllSeleect(dataBean));
groupList.add(sellerBean);
//添加子集合
childList.add(data.get(i).getList());
}
//展示数据
getShopCarView.showShopCar(groupList,childList);
}
}
@Override
public void onFailed(Exception e) {
}
});
}
//判断该商家下面的商品是否全选
private boolean isSellerProductAllSeleect(ShopCarBean.DataBean dataBean){
//获取该商家下的所有商品
List<ShopCarBean.DataBean.ListBean> list = dataBean.getList();
for (int i = 0; i < list.size(); i++) {
ShopCarBean.DataBean.ListBean listBean = list.get(i);
if (0==listBean.getSelected()){
return false;
}
}
return true;
}
@Override
public void detach() {
if (getShopCarView!=null){
getShopCarView=null;
}
}
}
2.购物车activity页面
package com.example.jingdong.ui.activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.TextView;
import com.example.jingdong.R;
import com.example.jingdong.bean.SellerBean;
import com.example.jingdong.bean.ShopCarBean;
import com.example.jingdong.presenter.GetShopCarPresenterImp;
import com.example.jingdong.ui.adapter.ElvShopCarAdapter;
import com.example.jingdong.ui.inter.GetShopCarView;
import com.example.jingdong.util.DialogUtil;
import com.example.jingdong.util.SpUtil;
import java.util.List;
public class ShopCarActivity extends AppCompatActivity implements GetShopCarView {
private GetShopCarPresenterImp getShopCarPresenterImp;
private ExpandableListView elv_shopcar;
private ProgressDialog progressDialog;
private ElvShopCarAdapter elvShopCarAdapter;
private TextView tv_money;
private TextView tv_total;
/**
* 全选
*/
private CheckBox ck_all;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shop_car);
initView();
//找控件
elv_shopcar = findViewById(R.id.elv_shopcar);
tv_money = findViewById(R.id.tv_Money);
tv_total = findViewById(R.id.tv_Total);
progressDialog = DialogUtil.getProgressDialog(this);
//绑定
getShopCarPresenterImp = new GetShopCarPresenterImp(this);
getShopCarPresenterImp.getShopCar(SpUtil.getString(ShopCarActivity.this, "uid", ""), SpUtil.getString(ShopCarActivity.this, "token", ""));
}
private void initView() {
ck_all = (CheckBox) findViewById(R.id.ck_all);
//点击全选按钮的监听
ck_all.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (elvShopCarAdapter!=null){
progressDialog.show();
elvShopCarAdapter.changeAllState(ck_all.isChecked());
}
}
});
}
//显示数据
@Override
public void showShopCar(List<SellerBean> groupList, List<List<ShopCarBean.DataBean.ListBean>> childList) {
//判断所有商家是否全部选中
ck_all.setChecked(isSellerAllSelected(groupList));
//设置适配器
elvShopCarAdapter = new ElvShopCarAdapter(groupList, childList, ShopCarActivity.this, getShopCarPresenterImp, progressDialog);
elv_shopcar.setAdapter(elvShopCarAdapter);
//获取商品总价和数量
String[] strings = elvShopCarAdapter.computeMoneyAndNum();
tv_money.setText("总计:" + strings[0] + "元");
tv_total.setText("去结算" + strings[1] + "个");
//默认全部展开
for (int i = 0; i < groupList.size(); i++) {
elv_shopcar.expandGroup(i);
}
//关闭进度条
progressDialog.dismiss();
}
private boolean isSellerAllSelected(List<SellerBean> groupList){
for (int i = 0; i < groupList.size(); i++) {
SellerBean sellerBean = groupList.get(i);
if (!sellerBean.isSelected()){
return false;
}
}
return true;
}
@Override
protected void onDestroy() {
super.onDestroy();
getShopCarPresenterImp.detach();
}
}
3.购物车expandablelistview的适配器
package com.example.jingdong.ui.adapter;
import android.app.ProgressDialog;
import android.content.Context;
import android.view.LayoutInflater;
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 android.widget.Toast;
import com.bumptech.glide.Glide;
import com.example.jingdong.R;
import com.example.jingdong.bean.SellerBean;
import com.example.jingdong.bean.ShopCarBean;
import com.example.jingdong.presenter.DeleteCarPresenterImp;
import com.example.jingdong.presenter.GetShopCarPresenterImp;
import com.example.jingdong.presenter.UpdateCarPresenterImp;
import com.example.jingdong.ui.inter.AddCarView;
import com.example.jingdong.ui.inter.DeleteCarView;
import com.example.jingdong.ui.inter.UpdateCarView;
import com.example.jingdong.ui.view.AddSubView;
import com.example.jingdong.util.SpUtil;
import java.util.List;
public class ElvShopCarAdapter extends BaseExpandableListAdapter implements UpdateCarView, DeleteCarView {
private List<SellerBean> groupList;
private List<List<ShopCarBean.DataBean.ListBean>> childList;
private Context context;
private GetShopCarPresenterImp getShopCarPresenterImp;
private final LayoutInflater inflater;
private final UpdateCarPresenterImp updateCarPresenterImp;
private ProgressDialog progressDialog;
private int productIndex;
private int groupPosition;
private static final int GETCARS = 0;//查询购物车
private static final int UPDATE_PRODUCT = 1;//更新商品
private static final int UPDATE_SELLER = 2;//更新卖家
private static int state = GETCARS;
private final String uid;
private final String token;
private boolean checked;
private boolean allChecked;
private final DeleteCarPresenterImp deleteCarPresenterImp;
public ElvShopCarAdapter(List<SellerBean> groupList, List<List<ShopCarBean.DataBean.ListBean>> childList, Context context,
GetShopCarPresenterImp getShopCarPresenterImp, ProgressDialog progressDialog) {
this.groupList = groupList;
this.childList = childList;
this.context = context;
this.getShopCarPresenterImp = getShopCarPresenterImp;
this.progressDialog = progressDialog;
inflater = LayoutInflater.from(context);
//获取uid和token
uid = SpUtil.getString(context, "uid", "");
token = SpUtil.getString(context, "token", "");
//绑定更新
updateCarPresenterImp = new UpdateCarPresenterImp(this);
//绑定删除
deleteCarPresenterImp = new DeleteCarPresenterImp(this);
}
@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) {
convertView = View.inflate(context, R.layout.elv_shopcarseller_item, null);
groupViewHolder = new GroupViewHolder(convertView);
convertView.setTag(groupViewHolder);
} else {
groupViewHolder = (GroupViewHolder) convertView.getTag();
}
//设置是否全部选中
groupViewHolder.ck_seller.setChecked(groupList.get(groupPosition).isSelected());
//设置数据
groupViewHolder.tv_sellername.setText(groupList.get(groupPosition).getSellerName());
//给商家的CheckBox设置点击事件
groupViewHolder.ck_seller.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
state = UPDATE_PRODUCT;
//显示进度条
progressDialog.show();
//默认从第一个商品开始更新购物车状态
productIndex = 0;
//全局记录一下当前更新的商家
ElvShopCarAdapter.this.groupPosition = groupPosition;
//该商家是否选中
checked = groupViewHolder.ck_seller.isChecked();
//更新商家下的商品状态
updateProductInSeller();
}
});
return convertView;
}
@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
final ChildViewHolder childViewHolder;
if (convertView == null) {
convertView = View.inflate(context, R.layout.elv_shopcarsellerpro_item, null);
childViewHolder = new ChildViewHolder(convertView);
convertView.setTag(childViewHolder);
} else {
childViewHolder = (ChildViewHolder) convertView.getTag();
}
//获取单个子商品
final ShopCarBean.DataBean.ListBean listBean = childList.get(groupPosition).get(childPosition);
//根据服务器返回的select值,给CheckBox设置是否选中
childViewHolder.ck_product.setChecked(listBean.getSelected() == 1 ? true : false);
//设置数据
childViewHolder.tv_producttitle.setText(listBean.getTitle());
childViewHolder.tv_productprice.setText("¥" + listBean.getPrice() + "");
Glide.with(context).load(listBean.getImages().split("\\|")[0]).into(childViewHolder.img_product);
//设置数量
childViewHolder.addsubcar.setNum(listBean.getNum() + "");
//给子条目的CheckBox设置点击事件
childViewHolder.ck_product.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
progressDialog.show();
state = GETCARS;
ElvShopCarAdapter.this.groupPosition = groupPosition;
//获取sellerid
String sellerid = groupList.get(groupPosition).getSellerid();
//获取pid
String pid = listBean.getPid() + "";
String num = listBean.getNum() + "";
//是否选中
boolean childChecked = childViewHolder.ck_product.isChecked();
//更新购物车
updateCarPresenterImp.updateCar(uid, sellerid, pid, num, childChecked ? "1" : "0", token);
}
});
//给加号设置点击事件
childViewHolder.addsubcar.setAddOnclickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
progressDialog.show();
state = GETCARS;
//获取sellerid
String sellerid = groupList.get(groupPosition).getSellerid();
//获取pid
int pid = listBean.getPid();
//获取数量
int num = listBean.getNum();
num++;
//是否选中
String isChecked = childViewHolder.ck_product.isChecked() ? "1" : "0";
//调用更新购物车的接口
updateCarPresenterImp.updateCar(uid, sellerid, pid + "", num + "", isChecked, token);
}
});
//给减号设置点击事件
childViewHolder.addsubcar.setSubOnclickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
progressDialog.show();
state = GETCARS;
//获取当前商品的数量
int num = listBean.getNum();
if (num <= 1) {
progressDialog.dismiss();
Toast.makeText(context, "数量不能小于1!", Toast.LENGTH_SHORT).show();
} else {
num--;
//获取sellerid
String sellerid = groupList.get(groupPosition).getSellerid();
//获取pid
String pid = listBean.getPid() + "";
//是否选中
String isChecked = childViewHolder.ck_product.isChecked() ? "1" : "0";
//更新服务器上购物车状态
updateCarPresenterImp.updateCar(uid, sellerid, pid, num + "", isChecked, token);
}
}
});
//给删除设置点击事件
childViewHolder.tv_del.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
progressDialog.show();
state = GETCARS;
//获取商品的pid
int pid = listBean.getPid();
//开始删除购物车里的选项
deleteCarPresenterImp.deleteCar(uid, pid + "", token);
}
});
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
//父控件的viewholder
public static class GroupViewHolder {
public View rootView;
public CheckBox ck_seller;
public TextView tv_sellername;
public GroupViewHolder(View rootView) {
this.rootView = rootView;
this.ck_seller = (CheckBox) rootView.findViewById(R.id.ck_seller);
this.tv_sellername = (TextView) rootView.findViewById(R.id.tv_sellername);
}
}
//子控件的viewholder
public static class ChildViewHolder {
public View rootView;
public CheckBox ck_product;
public TextView tv_del;
public ImageView img_product;
public TextView tv_producttitle;
public TextView tv_productprice;
public AddSubView addsubcar;
public ChildViewHolder(View rootView) {
this.rootView = rootView;
this.ck_product = (CheckBox) rootView.findViewById(R.id.ck_product);
this.tv_del = (TextView) rootView.findViewById(R.id.tv_del);
this.img_product = (ImageView) rootView.findViewById(R.id.img_product);
this.tv_producttitle = (TextView) rootView.findViewById(R.id.tv_producttitle);
this.tv_productprice = (TextView) rootView.findViewById(R.id.tv_productprice);
this.addsubcar = (AddSubView) rootView.findViewById(R.id.addsubcar);
}
}
//更新购物车成功的回调
@Override
public void updateSuccess() {
switch (state) {
case GETCARS:
//更新成功后调用查询购物车接口
productIndex = 0;
groupPosition = 0;
getShopCarPresenterImp.getShopCar(uid, token);
break;
case UPDATE_PRODUCT:
//更新成功一个商品以后,再接着更新该商家下的其他商品,直到没有商品为止
productIndex++;
//判断下标是否越界
if (productIndex < childList.get(groupPosition).size()) {
//可以继续更新商品
updateProductInSeller();
} else {
//商品已经全部更新完查询购物车
state = GETCARS;
updateSuccess();
}
break;
case UPDATE_SELLER:
//遍历所有商家下的商品,并更新状态
productIndex++;
//下标是否越界
if (productIndex<childList.get(groupPosition).size()){
//可以继续更新商品
updateProductInSeller(allChecked);
}else {
//第一个商家的商品已经全部更新完,请查询购物车
productIndex=0;
groupPosition++;
if (groupPosition<groupList.size()){
//可以继续更新商品
updateProductInSeller(allChecked);
}else {
//所有商家的所有商品已经全部更新完,查询购物车
state=GETCARS;
updateSuccess();
}
}
break;
}
}
//删除购物车成功的回调
@Override
public void delSuccess() {
//查询购物车
getShopCarPresenterImp.getShopCar(uid, token);
}
//更新商家下的商品状态
private void updateProductInSeller() {
//获取sellerid
SellerBean sellerBean = groupList.get(groupPosition);
String sellerid = sellerBean.getSellerid();
//获取pid
ShopCarBean.DataBean.ListBean listBean = childList.get(groupPosition).get(productIndex);
int pid = listBean.getPid();
int num = listBean.getNum();
//开始更新
updateCarPresenterImp.updateCar(uid, sellerid, pid + "", num + "", checked ? "1" : "0", token);
}
private void updateProductInSeller(boolean bool) {
//获取sellerid
SellerBean sellerBean = groupList.get(groupPosition);
String sellerid = sellerBean.getSellerid();
//获取pid
ShopCarBean.DataBean.ListBean listBean = childList.get(groupPosition).get(productIndex);
int pid = listBean.getPid();
int num = listBean.getNum();
//开始更新
updateCarPresenterImp.updateCar(uid, sellerid, pid + "", num + "", bool ? "1" : "0", token);
}
//计算数量和价钱
public String[] computeMoneyAndNum() {
double sum = 0;
int num = 0;
for (int i = 0; i < groupList.size(); i++) {
for (int j = 0; j < childList.get(i).size(); j++) {
//判断商品是否选中
ShopCarBean.DataBean.ListBean listBean = childList.get(i).get(j);
if (listBean.getSelected() == 1) {
//该商品为选中状态
sum += listBean.getPrice() * listBean.getNum();
num += listBean.getNum();
}
}
}
return new String[]{sum + "", num + ""};
}
//全选复选框更新状态
public void changeAllState(boolean bool) {
this.allChecked = bool;
state = UPDATE_SELLER;
//遍历商家下的商品修改状态
updateProductInSeller(bool);
}
}
4.自定义加减器页面
package com.example.jingdong.ui.view;
import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.jingdong.R;
public class AddSubView extends LinearLayout {
private TextView tv_productSub;
private TextView tv_productNum;
private TextView tv_productAdd;
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);
tv_productSub=view.findViewById(R.id.tv_productSub);
tv_productNum=view.findViewById(R.id.tv_productNum);
tv_productAdd=view.findViewById(R.id.tv_productAdd);
}
public String getNum() {
return tv_productNum.getText().toString();
}
public void setNum(String str) {
tv_productNum.setText(str);
}
//给加号设置点击事件
public void setAddOnclickListener(OnClickListener onclickListener){
tv_productAdd.setOnClickListener(onclickListener);
}
//给减号设置点击事件
public void setSubOnclickListener(OnClickListener onclickListener){
tv_productSub.setOnClickListener(onclickListener);
}
}
5.自定义加减器布局页面
<?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:orientation="horizontal">
<TextView
android:id="@+id/tv_productSub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/cart_biankuang"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:text="-"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_productNum"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/cart_biankuang"
android:paddingLeft="3dp"
android:paddingRight="3dp"
android:text="12"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_productAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/cart_biankuang"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:text="+"
android:textSize="12sp" />
</LinearLayout>
6.购物车expandablelistview的子布局页面
<?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"
android:padding="2dp">
<CheckBox
android:id="@+id/ck_product"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="12dp" />
<TextView
android:id="@+id/tv_del"
android:layout_width="45dp"
android:layout_height="30dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:background="#ff0000"
android:gravity="center"
android:text="删除"
android:textColor="#fff" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_toLeftOf="@id/tv_del"
android:layout_toRightOf="@id/ck_product"
android:orientation="horizontal">
<ImageView
android:id="@+id/img_product"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center_vertical" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="2dp"
android:layout_marginLeft="2dp"
android:layout_marginTop="2dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_producttitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="title"
android:textSize="11sp" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_productprice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="12312"
android:textColor="#f00"
android:textSize="10sp" />
<com.example.jingdong.ui.view.AddSubView
android:id="@+id/addsubcar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginRight="3dp"></com.example.jingdong.ui.view.AddSubView>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</RelativeLayout>