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>