我们平时在网上买东西 经常用到购物车功能,今天就简单写一下这个模块的一些基本功能,先附上两张效果图
先介绍下基本功能:购物车里面有1-多个店铺,每个店铺里又可能有1-多件商品;在购物车里可以编辑每个店铺里的商品(包括增加和减少商品数量、删除购物车里的商品);结算的时候要选中要买的商品,同时自动计算总商品价格,在选择商品的时候可以勾选店铺,则此店铺下了商品全部选中,为了方便,如果购物车里商品全部购买,则可以选中 全选按钮,则所有店铺商品全部选中。
页面布局用到了ExpandableListView二级列表来展示店铺以及店铺下的商品。 编辑和正常状态切换不同布局来显示就可以了。
在adapter里面写了几个操作接口 ,方便编辑
/**
* 店铺的复选框
*/
public interface CheckInterface {
/**
* 组选框状态改变触发的事件
*
* @param groupPosition 组元素的位置
* @param isChecked 组元素的选中与否
*/
void checkGroup(int groupPosition, boolean isChecked);
/**
* 子选框状态改变触发的事件
*
* @param groupPosition 组元素的位置
* @param childPosition 子元素的位置
* @param isChecked 子元素的选中与否
*/
void checkChild(int groupPosition, int childPosition, boolean isChecked);
}
/**
* 改变数量的接口
*/
public interface ModifyCountInterface {
/**
* 增加操作
*
* @param groupPosition 组元素的位置
* @param childPosition 子元素的位置
* @param showCountView 用于展示变化后数量的View
* @param isChecked 子元素选中与否
*/
void doIncrease(int groupPosition, int childPosition, View showCountView, boolean isChecked);
void doDecrease(int groupPosition, int childPosition, View showCountView, boolean isChecked);
void doUpdate(int groupPosition, int childPosition, View showCountView, boolean isChecked);
/**
* 删除子Item
*
* @param groupPosition
* @param childPosition
*/
void childDelete(int groupPosition, int childPosition);
}
/**
* 监听编辑状态
*/
public interface GroupEditorListener {
void groupEditor(int groupPosition);
}
public CheckInterface getCheckInterface() {
return checkInterface;
}
public void setCheckInterface(CheckInterface checkInterface) {
this.checkInterface = checkInterface;
}
public GroupEditorListener getGroupEditorListener() {
return groupEditorListener;
}
public void setGroupEditorListener(GroupEditorListener groupEditorListener) {
this.groupEditorListener = groupEditorListener;
}
public ModifyCountInterface getModifyCountInterface() {
return modifyCountInterface;
}
public void setModifyCountInterface(ModifyCountInterface modifyCountInterface) {
this.modifyCountInterface = modifyCountInterface;
}
adapter里面对组的操作
/**【文字指的是组的按钮的文字】
* 当我们按下ActionBar的 "编辑"按钮, 应该把所有组的文字显示"编辑",并且设置按钮为不可见
* 当我们完成编辑后,再把组的编辑按钮设置为可见
* 不懂,请自己操作淘宝,观察一遍
*/
if(storeInfoList.get(groupPosition).isActionBarEditor()){
storeInfoList.get(groupPosition).setEditor(false);
groupViewHolder.storeEdit.setVisibility(View.INVISIBLE);
flag=false;
}else{
flag=true;
groupViewHolder.storeEdit.setVisibility(View.VISIBLE);
}
/**
* 思路:当我们按下组的"编辑"按钮后,组处于编辑状态,文字显示"完成"
* 当我们点击“完成”按钮后,文字显示"编辑“,组处于未编辑状态
*/
if (storeInfoList.get(groupPosition).isEditor()){
groupViewHolder.storeEdit.setText("完成");
}else {
groupViewHolder.storeEdit.setText("编辑");
}
groupViewHolder.storeEdit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
groupEditorListener.groupEditor(groupPosition);
if (storeInfoList.get(groupPosition).isEditor()){
storeInfoList.get(groupPosition).setEditor(false);
}else {
storeInfoList.get(groupPosition).setEditor(true);
}
notifyDataSetChanged();
}
});
adapter里对子列表的操作
/**
* 根据组的编辑按钮的可见与不可见,去判断是组对下辖的子元素编辑 还是ActionBar对组的下瞎元素的编辑
* 如果组的编辑按钮可见,那么肯定是组对自己下辖元素的编辑
* 如果组的编辑按钮不可见,那么肯定是ActionBar对组下辖元素的编辑
*/
if (flag){//组的编辑按钮可见
if (storeInfoList.get(groupPosition).isEditor()){//组对自己下辖元素的编辑
childViewHolder.editGoodsData.setVisibility(View.VISIBLE);//编辑时布局显示
childViewHolder.goodsDataNoedit.setVisibility(View.GONE);//未编辑时布局隐藏掉
}else {
childViewHolder.editGoodsData.setVisibility(View.GONE);//编辑时布局隐藏掉
childViewHolder.goodsDataNoedit.setVisibility(View.VISIBLE);//未编辑时布局显示
}
}else {//组的编辑按钮不可见
if(storeInfoList.get(groupPosition).isActionBarEditor()){
childViewHolder.editGoodsData.setVisibility(View.VISIBLE);//编辑时布局显示
childViewHolder.goodsDataNoedit.setVisibility(View.GONE);//未编辑时布局隐藏掉
}else {
childViewHolder.editGoodsData.setVisibility(View.GONE);//编辑时布局隐藏掉
childViewHolder.goodsDataNoedit.setVisibility(View.VISIBLE);//未编辑时布局显示
}
}
if (storeInfoList.get(groupPosition).getShopList().get(childPosition) != null){
childViewHolder.goodsImage.setImageResource(R.mipmap.ic_launcher);
childViewHolder.goodsName.setText(storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsTitle());
childViewHolder.goods_size.setText("类型:"+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsType());
childViewHolder.goodsPrice.setText("¥"+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsPrice());
childViewHolder.goodsBuyNum.setText("×"+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsNum());
childViewHolder.goodsNumEdit.setText(""+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsNum());
childViewHolder.goodsSizeEdit.setText("类型:"+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsType());
childViewHolder.childCheckBox.setChecked(storeInfoList.get(groupPosition).getShopList().get(childPosition).isChoosed());
//复选框
childViewHolder.childCheckBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
storeInfoList.get(groupPosition).getShopList().get(childPosition).setChoosed(((CheckBox) view).isChecked());
childViewHolder.childCheckBox.setChecked(((CheckBox) view).isChecked());
checkInterface.checkChild(groupPosition,childPosition,((CheckBox) view).isChecked());
}
});
//-
childViewHolder.reduceGoodsNum.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
modifyCountInterface.doDecrease(groupPosition,childPosition,childViewHolder.goodsNumEdit,childViewHolder.childCheckBox.isChecked());
}
});
//+
childViewHolder.increaseGoodsNum.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
modifyCountInterface.doIncrease(groupPosition,childPosition,childViewHolder.goodsNumEdit, childViewHolder.childCheckBox.isChecked());
}
});
childViewHolder.goodsNumEdit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//TODO 编辑商品数量
}
});
//删除
childViewHolder.delGoods.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setTitle("删除商品")
.setMessage("确定删除该商品吗?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
modifyCountInterface.childDelete(groupPosition,childPosition);
dialogInterface.dismiss();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
builder.create().show();
}
});
}
下面是在activity页面里实现功能的操作
1、右上角编辑按钮
/**
* 右上角编辑按钮
* ActionBar标题上点编辑的时候,只显示每一个店铺的商品修改界面
* ActionBar标题上点完成的时候,只显示每一个店铺的商品信息界面
*/
private void setActionBarEditor() {
for (int i = 0; i < storeInfoList.size(); i++) {
ShoppingcartStoreInfo group = storeInfoList.get(i);
if (group.isActionBarEditor()) {
group.setActionBarEditor(false);
flag = false;
} else {
group.setActionBarEditor(true);
flag = true;
}
setVisiable();
}
adapter.notifyDataSetChanged();
}
private void setVisiable() {
if (flag) {
tv_management.setText("完成");
} else {
tv_management.setText("管理");
}
}
2、底部左下角全选和反选按钮
/**
* 底部左下角全选和反选按钮
*/
private void doCheckAll() {
for (int i = 0; i < storeInfoList.size(); i++) {
ShoppingcartStoreInfo group = storeInfoList.get(i);
group.setChoosed(checkAll.isChecked());
List<ShoppingcartGoodsInfo> child = storeInfoList.get(i).getShopList();
for (int j = 0; j < child.size(); j++) {
child.get(j).setChoosed(checkAll.isChecked());
}
}
adapter.notifyDataSetChanged();
calulate();
}
3、计算商品总价
/**
* 计算商品总价格,操作步骤
* 1.先清空全局计价,计数
* 2.遍历所有的子元素,只要是被选中的,就进行相关的计算操作
* 3.给textView填充数据
*/
private void calulate() {
mtotalPrice = 0.00;
mtotalCount = 0;
for (int i = 0; i < storeInfoList.size(); i++) {
List<ShoppingcartGoodsInfo> child = storeInfoList.get(i).getShopList();
for (int j = 0; j < child.size(); j++) {
ShoppingcartGoodsInfo good = child.get(j);
if (good.isChoosed()) {
mtotalCount++;
mtotalPrice += good.getGoodsPrice() * good.getGoodsNum();
}
}
}
tv_totalPrice.setText("¥" + mtotalPrice + "");
btn_settlement.setText("结算(" + mtotalCount + ")");
if (mtotalCount == 0) {
// setCartNum();
} else {
shoppingcatNum.setText("购物车(" + mtotalCount + ")");//类似淘宝标题栏的购物车数量
}
}
4、组(店铺)的全选按钮
/**
* 组group选中按钮
* @param groupPosition 组元素的位置
* @param isChecked 组元素的选中与否
* 思路:组元素被选中了,那么下辖全部的子元素也被选中
*/
@Override
public void checkGroup(int groupPosition, boolean isChecked) {
List<ShoppingcartGoodsInfo> child = storeInfoList.get(groupPosition).getShopList();
for (int i = 0; i < child.size(); i++) {
child.get(i).setChoosed(isChecked);
}
if (isCheckAll()) {
checkAll.setChecked(true);//全选
} else {
checkAll.setChecked(false);//反选
}
adapter.notifyDataSetChanged();
calulate();
}
5、子列表(店铺里商品)按钮的选中
/**
* 子child选中按钮
* @param groupPosition 组元素的位置
* @param childPosition 子元素的位置
* @param isChecked 子元素的选中与否
*/
@Override
public void checkChild(int groupPosition, int childPosition, boolean isChecked) {
boolean allChildSameState = true; //判断该组下面的所有子元素是否处于同一状态
List<ShoppingcartGoodsInfo> child = storeInfoList.get(groupPosition).getShopList();
for (int i = 0; i < child.size(); i++) {
//不选全中
if (child.get(i).isChoosed() != isChecked) {
allChildSameState = false;
break;
}
}
if (allChildSameState) {
storeInfoList.get(groupPosition).setChoosed(isChecked);//如果子元素状态相同,那么对应的组元素也设置成这一种的同一状态
} else {
storeInfoList.get(groupPosition).setChoosed(false);//否则一律视为未选中
}
if (isCheckAll()) {
checkAll.setChecked(true);//全选
} else {
checkAll.setChecked(false);//反选
}
adapter.notifyDataSetChanged();
calulate();
}
6、判断所有组的按钮是否全选中
/**
* 判断所有组的按钮是否全选中
* @return
*/
private boolean isCheckAll(){
boolean childIsChoosed = true;//子商品是否选择
boolean groupIsChoosed = true;//组元素是否选中
for (int i = 0; i < storeInfoList.size();i++){
List<ShoppingcartGoodsInfo> child = storeInfoList.get(i).getShopList();
for (int j = 0; j < child.size(); j++){
if (child.get(j).isChoosed()){
childIsChoosed = true;//已选中
}else {
childIsChoosed = false;//未选中
break;
}
}
if (childIsChoosed){
storeInfoList.get(i).setChoosed(true);//如果子商品全选中,那么此店铺对应的组元素也选中
groupIsChoosed = true;
}else {
storeInfoList.get(i).setChoosed(false);//否则组元素视为未选中
groupIsChoosed = false;
break;
}
}
return groupIsChoosed;
}
7、商品的增加按钮
/**
* 增加商品按钮
* @param groupPosition 组元素的位置
* @param childPosition 子元素的位置
* @param showCountView 用于展示变化后数量的View
* @param isChecked 子元素选中与否
*/
@Override
public void doIncrease(int groupPosition, int childPosition, View showCountView, boolean isChecked) {
ShoppingcartGoodsInfo good = (ShoppingcartGoodsInfo) adapter.getChild(groupPosition, childPosition);
int count = good.getGoodsNum();
count++;
good.setGoodsNum(count);
((TextView) showCountView).setText(String.valueOf(count));
adapter.notifyDataSetChanged();
calulate();
}
8、商品的减少按钮
/**
* 减少商品按钮
* @param groupPosition
* @param childPosition
* @param showCountView
* @param isChecked
*/
@Override
public void doDecrease(int groupPosition, int childPosition, View showCountView, boolean isChecked) {
ShoppingcartGoodsInfo good = (ShoppingcartGoodsInfo) adapter.getChild(groupPosition, childPosition);
int count = good.getGoodsNum();
if (Integer.parseInt(((TextView) showCountView).getText().toString()) <= 1 ){
count = 1;
((TextView) showCountView).setText("" + count);
Toast.makeText(this,"不能少于1件",Toast.LENGTH_SHORT).show();
return;
}
count--;
good.setGoodsNum(count);
((TextView) showCountView).setText("" + count);
adapter.notifyDataSetChanged();
calulate();
}
9、商品编辑时候的商品删除按钮
/**
* 子child中删除按钮
* @param groupPosition
* @param childPosition 思路:当子元素=0,那么组元素也要删除
*/
@Override
public void childDelete(int groupPosition, int childPosition) {
List<ShoppingcartGoodsInfo> child = storeInfoList.get(groupPosition).getShopList();
child.remove(childPosition);
if (child.size() == 0) {
storeInfoList.remove(groupPosition);
}
adapter.notifyDataSetChanged();
calulate();
}
下面附上完整代码:
购物车页面布局activity_shopcart.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="wrap_content"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="46dp"
android:background="@color/colorAccent">
<TextView
android:id="@+id/shoppingcatNum"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="购物车(15)"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_management"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="15dp"
android:text="管理"
android:textColor="@color/white"
android:textSize="15sp" />
</RelativeLayout>
<ExpandableListView
android:id="@+id/expandableListView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:childDivider="@color/gray_color"
android:dividerHeight="1dp"
android:groupIndicator="@null" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal"
android:gravity="center_vertical"
android:layout_alignParentBottom="true"
android:background="@color/gray_color">
<CheckBox
android:id="@+id/checkAll"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="10dp"
android:text="全选"
android:textSize="15sp"
android:textColor="@color/black"/>
<TextView
android:id="@+id/tv_heji"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="合计:"
android:textSize="15sp"
android:textColor="@color/black"/>
<TextView
android:id="@+id/tv_totalPrice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:text="¥0.00"
android:textColor="@color/red_text"
android:textSize="15sp"
android:textStyle="bold"/>
<Button
android:id="@+id/btn_settlement"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@color/red_text"
android:textColor="@color/white"
android:textSize="15sp"
android:text="结算:(5)"/>
</LinearLayout>
</RelativeLayout>
列表组(店铺)布局item_group_shoppingcart.xml文件
<?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="match_parent"
android:background="@color/white">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<CheckBox
android:id="@+id/item_shopcart_group_checkBox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_weight="1" />
<TextView
android:id="@+id/item_shopcart_group_nameTv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_weight="4"
android:text="1号店铺"
android:textColor="@color/black"
android:textSize="15sp" />
<Button
android:id="@+id/item_shopcart_group_editBtn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:layout_weight="1"
android:background="@color/white"
android:text="编辑" />
</LinearLayout>
</LinearLayout>
子列表(店铺里商品)布局item_child_shoppingcart.xml文件
<?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="wrap_content"
android:background="@color/white"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingLeft="10dp"
android:gravity="center_vertical">
<CheckBox
android:id="@+id/item_shopcart_child_checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<!--图片的paddingTop与paddingBotton与内容布局的一样:如需修改,请注意-->
<ImageView
android:id="@+id/item_shopcart_child_goods_image"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_marginLeft="10dp"
android:src="@mipmap/lead_1"/>
<!--未编辑时的布局-->
<LinearLayout
android:id="@+id/item_shopcart_child_goods_data_noedit"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="6dp"
android:orientation="vertical"
android:visibility="visible">
<TextView
android:id="@+id/tv_goodsTitle"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:text="1号店铺的第一个商品"
android:textColor="@color/black"
android:textSize="15sp"/>
<TextView
android:id="@+id/tv_goodsType"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginTop="5dp"
android:text="类型:半袖,颜色:白色"
android:textColor="@color/gray_color"
android:textSize="13sp"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center_vertical">
<TextView
android:id="@+id/tv_goodsPrice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="¥100.00"
android:textSize="13sp"
android:textStyle="bold"
android:textColor="@color/red_text"/>
<TextView
android:id="@+id/tv_goodsNum"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="10dp"
android:text="×1"
android:textSize="13sp"
android:textColor="@color/gray_color"/>
</RelativeLayout>
</LinearLayout>
<!--编辑时的布局-->
<LinearLayout
android:id="@+id/item_shopcart_child_edit_goods_data"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:visibility="gone">
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:orientation="vertical">
<LinearLayout
android:layout_marginTop="12px"
android:layout_width="match_parent"
android:layout_height="66px"
android:layout_marginRight="10dp"
android:orientation="horizontal">
<Button
android:id="@+id/item_shopcart_child_reduce"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="-"/>
<TextView
android:id="@+id/tv_item_shopcart_child_goods_Num_edit"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="2"
android:gravity="center"/>
<Button
android:id="@+id/item_shopcart_child_add"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="+"
android:textColor="@color/red_text"/>
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical">
<TextView
android:id="@+id/item_shopcart_child_goods_sizeEdit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="类型:半袖,颜色:白色"
android:textColor="@color/gray_color"
android:textSize="13sp"/>
<ImageView
android:layout_toRightOf="@id/item_shopcart_child_goods_sizeEdit"
android:layout_alignBottom="@id/item_shopcart_child_goods_sizeEdit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginBottom="4dp"
android:src="@mipmap/d44_icon_jiantou_xia" />
</RelativeLayout>
</LinearLayout>
<TextView
android:id="@+id/tv_goodsDel"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:background="@color/red_text"
android:text="删除"
android:textColor="@color/white"/>
</LinearLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/gray_color"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"/>
</LinearLayout>
适配器adapter文件ShoppingcartAdapter
package com.junto.text.ShoppingCart;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.junto.text.R;
import java.util.ArrayList;
import java.util.List;
/**
* Created by WangJinyong on 2019/7/8.
* 购物车 二级列表适配器 adapter
*/
public class ShoppingcartAdapter extends BaseExpandableListAdapter {
private Context context;
private List<ShoppingcartStoreInfo> storeInfoList = new ArrayList<>();
private CheckInterface checkInterface;
private GroupEditorListener groupEditorListener;
private ModifyCountInterface modifyCountInterface;
private int count = 0;
private boolean flag=true; //组的编辑按钮是否可见,true可见,false不可见
public ShoppingcartAdapter(Context context,List<ShoppingcartStoreInfo> storeInfoList){
this.context = context;
this.storeInfoList = storeInfoList;
}
@Override
public int getGroupCount() {
return storeInfoList == null ?0:storeInfoList.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return storeInfoList.get(groupPosition).getShopList().size();
}
@Override
public Object getGroup(int groupPosition) {
return storeInfoList.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return storeInfoList.get(groupPosition).getShopList().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 false;
}
@Override
public View getGroupView(final int groupPosition, boolean b, View convertView, ViewGroup viewGroup) {
GroupViewHolder groupViewHolder;
if (convertView == null){
groupViewHolder = new GroupViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.item_group_shoppingcart,viewGroup,false);
groupViewHolder.storeCheckBox = convertView.findViewById(R.id.item_shopcart_group_checkBox);
groupViewHolder.storeName = convertView.findViewById(R.id.item_shopcart_group_nameTv);
groupViewHolder.storeEdit = convertView.findViewById(R.id.item_shopcart_group_editBtn);
convertView.setTag(groupViewHolder);
}else {
groupViewHolder = (GroupViewHolder) convertView.getTag();
}
groupViewHolder.storeName.setText(storeInfoList.get(groupPosition).getShopName());
groupViewHolder.storeCheckBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
storeInfoList.get(groupPosition).setChoosed(((CheckBox)view).isChecked());
checkInterface.checkGroup(groupPosition,((CheckBox)view).isChecked());
}
});
groupViewHolder.storeCheckBox.setChecked(storeInfoList.get(groupPosition).isChoosed());
/**【文字指的是组的按钮的文字】
* 当我们按下ActionBar的 "编辑"按钮, 应该把所有组的文字显示"编辑",并且设置按钮为不可见
* 当我们完成编辑后,再把组的编辑按钮设置为可见
* 不懂,请自己操作淘宝,观察一遍
*/
if(storeInfoList.get(groupPosition).isActionBarEditor()){
storeInfoList.get(groupPosition).setEditor(false);
groupViewHolder.storeEdit.setVisibility(View.INVISIBLE);
flag=false;
}else{
flag=true;
groupViewHolder.storeEdit.setVisibility(View.VISIBLE);
}
/**
* 思路:当我们按下组的"编辑"按钮后,组处于编辑状态,文字显示"完成"
* 当我们点击“完成”按钮后,文字显示"编辑“,组处于未编辑状态
*/
if (storeInfoList.get(groupPosition).isEditor()){
groupViewHolder.storeEdit.setText("完成");
}else {
groupViewHolder.storeEdit.setText("编辑");
}
groupViewHolder.storeEdit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
groupEditorListener.groupEditor(groupPosition);
if (storeInfoList.get(groupPosition).isEditor()){
storeInfoList.get(groupPosition).setEditor(false);
}else {
storeInfoList.get(groupPosition).setEditor(true);
}
notifyDataSetChanged();
}
});
return convertView;
}
@Override
public View getChildView(final int groupPosition, final int childPosition, boolean b, View convertView, ViewGroup viewGroup) {
final ChildViewHolder childViewHolder;
if (convertView == null){
childViewHolder = new ChildViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.item_child_shoppingcart,viewGroup,false);
childViewHolder.childCheckBox = convertView.findViewById(R.id.item_shopcart_child_checkBox);
childViewHolder.goodsImage = convertView.findViewById(R.id.item_shopcart_child_goods_image);
childViewHolder.goodsDataNoedit = convertView.findViewById(R.id.item_shopcart_child_goods_data_noedit);
childViewHolder.goodsName = convertView.findViewById(R.id.tv_goodsTitle);
childViewHolder.goods_size = convertView.findViewById(R.id.tv_goodsType);
childViewHolder.goodsPrice = convertView.findViewById(R.id.tv_goodsPrice);
childViewHolder.goodsBuyNum = convertView.findViewById(R.id.tv_goodsNum);
childViewHolder.editGoodsData = convertView.findViewById(R.id.item_shopcart_child_edit_goods_data);
childViewHolder.reduceGoodsNum = convertView.findViewById(R.id.item_shopcart_child_reduce);
childViewHolder.goodsNumEdit = convertView.findViewById(R.id.tv_item_shopcart_child_goods_Num_edit);
childViewHolder.increaseGoodsNum = convertView.findViewById(R.id.item_shopcart_child_add);
childViewHolder.goodsSizeEdit = convertView.findViewById(R.id.item_shopcart_child_goods_sizeEdit);
childViewHolder.delGoods = convertView.findViewById(R.id.tv_goodsDel);
convertView.setTag(childViewHolder);
}else {
childViewHolder = (ChildViewHolder) convertView.getTag();
}
/**
* 根据组的编辑按钮的可见与不可见,去判断是组对下辖的子元素编辑 还是ActionBar对组的下瞎元素的编辑
* 如果组的编辑按钮可见,那么肯定是组对自己下辖元素的编辑
* 如果组的编辑按钮不可见,那么肯定是ActionBar对组下辖元素的编辑
*/
if (flag){//组的编辑按钮可见
if (storeInfoList.get(groupPosition).isEditor()){//组对自己下辖元素的编辑
childViewHolder.editGoodsData.setVisibility(View.VISIBLE);//编辑时布局显示
childViewHolder.goodsDataNoedit.setVisibility(View.GONE);//未编辑时布局隐藏掉
}else {
childViewHolder.editGoodsData.setVisibility(View.GONE);//编辑时布局隐藏掉
childViewHolder.goodsDataNoedit.setVisibility(View.VISIBLE);//未编辑时布局显示
}
}else {//组的编辑按钮不可见
if(storeInfoList.get(groupPosition).isActionBarEditor()){
childViewHolder.editGoodsData.setVisibility(View.VISIBLE);//编辑时布局显示
childViewHolder.goodsDataNoedit.setVisibility(View.GONE);//未编辑时布局隐藏掉
}else {
childViewHolder.editGoodsData.setVisibility(View.GONE);//编辑时布局隐藏掉
childViewHolder.goodsDataNoedit.setVisibility(View.VISIBLE);//未编辑时布局显示
}
}
if (storeInfoList.get(groupPosition).getShopList().get(childPosition) != null){
childViewHolder.goodsImage.setImageResource(R.mipmap.ic_launcher);
childViewHolder.goodsName.setText(storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsTitle());
childViewHolder.goods_size.setText("类型:"+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsType());
childViewHolder.goodsPrice.setText("¥"+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsPrice());
childViewHolder.goodsBuyNum.setText("×"+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsNum());
childViewHolder.goodsNumEdit.setText(""+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsNum());
childViewHolder.goodsSizeEdit.setText("类型:"+storeInfoList.get(groupPosition).getShopList().get(childPosition).getGoodsType());
childViewHolder.childCheckBox.setChecked(storeInfoList.get(groupPosition).getShopList().get(childPosition).isChoosed());
//复选框
childViewHolder.childCheckBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
storeInfoList.get(groupPosition).getShopList().get(childPosition).setChoosed(((CheckBox) view).isChecked());
childViewHolder.childCheckBox.setChecked(((CheckBox) view).isChecked());
checkInterface.checkChild(groupPosition,childPosition,((CheckBox) view).isChecked());
}
});
//-
childViewHolder.reduceGoodsNum.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
modifyCountInterface.doDecrease(groupPosition,childPosition,childViewHolder.goodsNumEdit,childViewHolder.childCheckBox.isChecked());
}
});
//+
childViewHolder.increaseGoodsNum.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
modifyCountInterface.doIncrease(groupPosition,childPosition,childViewHolder.goodsNumEdit, childViewHolder.childCheckBox.isChecked());
}
});
childViewHolder.goodsNumEdit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//TODO 编辑商品数量
}
});
//删除
childViewHolder.delGoods.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setTitle("删除商品")
.setMessage("确定删除该商品吗?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
modifyCountInterface.childDelete(groupPosition,childPosition);
dialogInterface.dismiss();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
builder.create().show();
}
});
}
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
/**
* 店铺的复选框
*/
public interface CheckInterface {
/**
* 组选框状态改变触发的事件
*
* @param groupPosition 组元素的位置
* @param isChecked 组元素的选中与否
*/
void checkGroup(int groupPosition, boolean isChecked);
/**
* 子选框状态改变触发的事件
*
* @param groupPosition 组元素的位置
* @param childPosition 子元素的位置
* @param isChecked 子元素的选中与否
*/
void checkChild(int groupPosition, int childPosition, boolean isChecked);
}
/**
* 改变数量的接口
*/
public interface ModifyCountInterface {
/**
* 增加操作
*
* @param groupPosition 组元素的位置
* @param childPosition 子元素的位置
* @param showCountView 用于展示变化后数量的View
* @param isChecked 子元素选中与否
*/
void doIncrease(int groupPosition, int childPosition, View showCountView, boolean isChecked);
void doDecrease(int groupPosition, int childPosition, View showCountView, boolean isChecked);
void doUpdate(int groupPosition, int childPosition, View showCountView, boolean isChecked);
/**
* 删除子Item
*
* @param groupPosition
* @param childPosition
*/
void childDelete(int groupPosition, int childPosition);
}
/**
* 监听编辑状态
*/
public interface GroupEditorListener {
void groupEditor(int groupPosition);
}
public CheckInterface getCheckInterface() {
return checkInterface;
}
public void setCheckInterface(CheckInterface checkInterface) {
this.checkInterface = checkInterface;
}
public GroupEditorListener getGroupEditorListener() {
return groupEditorListener;
}
public void setGroupEditorListener(GroupEditorListener groupEditorListener) {
this.groupEditorListener = groupEditorListener;
}
public ModifyCountInterface getModifyCountInterface() {
return modifyCountInterface;
}
public void setModifyCountInterface(ModifyCountInterface modifyCountInterface) {
this.modifyCountInterface = modifyCountInterface;
}
static class GroupViewHolder {
CheckBox storeCheckBox;//复选框
TextView storeName;//店铺名
TextView storeEdit;//编辑按钮
}
static class ChildViewHolder{
CheckBox childCheckBox;//复选框
ImageView goodsImage;//商品图片
LinearLayout goodsDataNoedit;//未编辑状态布局
TextView goodsName;//商品名称
TextView goods_size;//商品类型
TextView goodsPrice;//商品价格
TextView goodsBuyNum;//商品购买数量
LinearLayout editGoodsData;//编辑状态布局
Button reduceGoodsNum;//-
TextView goodsNumEdit;//编辑时的数量
Button increaseGoodsNum;//+
TextView goodsSizeEdit;//商品类型编辑
TextView delGoods;//删除
}
}
设置店铺列表数据的实体类文件ShoppingcartStoreInfo
package com.junto.text.ShoppingCart;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* Created by WangJinyong on 2019/7/8.
* 店铺列表
*/
public class ShoppingcartStoreInfo implements Serializable {
private boolean choosed;//是否选择
private String shopName;//店铺名
private boolean editor;//编辑
private List<ShoppingcartGoodsInfo> shopList = new ArrayList<>();//店铺里的商品列表
private boolean actionBarEditor;//题上的编辑(管理)或完成
public boolean isChoosed() {
return choosed;
}
public void setChoosed(boolean choosed) {
this.choosed = choosed;
}
public String getShopName() {
return shopName;
}
public void setShopName(String shopName) {
this.shopName = shopName;
}
public boolean isEditor() {
return editor;
}
public void setEditor(boolean editor) {
this.editor = editor;
}
public List<ShoppingcartGoodsInfo> getShopList() {
return shopList;
}
public void setShopList(List<ShoppingcartGoodsInfo> shopList) {
this.shopList = shopList;
}
public boolean isActionBarEditor() {
return actionBarEditor;
}
public void setActionBarEditor(boolean actionBarEditor) {
this.actionBarEditor = actionBarEditor;
}
}
设置商品列表的实体类文件ShoppingcartGoodsInfo
package com.junto.text.ShoppingCart;
import java.io.Serializable;
/**
* Created by WangJinyong on 2019/7/8.
* 店铺里商品列表
*/
public class ShoppingcartGoodsInfo implements Serializable {
private boolean choosed;//是否选择
private String goodsTitle;//商品标题
private String goodsType;//商品类型
private Double goodsPrice;//商品单价
private int goodsNum;//商品数量
public boolean isChoosed() {
return choosed;
}
public void setChoosed(boolean choosed) {
this.choosed = choosed;
}
public String getGoodsTitle() {
return goodsTitle;
}
public void setGoodsTitle(String goodsTitle) {
this.goodsTitle = goodsTitle;
}
public String getGoodsType() {
return goodsType;
}
public void setGoodsType(String goodsType) {
this.goodsType = goodsType;
}
public Double getGoodsPrice() {
return goodsPrice;
}
public void setGoodsPrice(Double goodsPrice) {
this.goodsPrice = goodsPrice;
}
public int getGoodsNum() {
return goodsNum;
}
public void setGoodsNum(int goodsNum) {
this.goodsNum = goodsNum;
}
}
购物车整体页面及功能实现类ShopCartActivity
package com.junto.text.ShoppingCart;
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.Toast;
import com.junto.text.R;
import java.util.ArrayList;
import java.util.List;
/**
* Created by WangJinyong on 2019/7/9.
* 仿购物车页面
*/
public class ShopCartActivity extends Activity implements ShoppingcartAdapter.CheckInterface,ShoppingcartAdapter.GroupEditorListener,ShoppingcartAdapter.ModifyCountInterface {
private TextView shoppingcatNum,tv_management;//标题购物车及商品总数 、管理
private CheckBox checkAll;//全选
private TextView tv_totalPrice;//总价
private Button btn_settlement;//结算
private ExpandableListView expandableListView;
private ShoppingcartAdapter adapter;
private List<ShoppingcartStoreInfo> storeInfoList = new ArrayList<>();
private List<ShoppingcartGoodsInfo> goodsInfoList = new ArrayList<>();
private boolean flag=true; //右上角的编辑按钮false就是右上角编辑,ture就是完成
private double mtotalPrice;//总价格
private int mtotalCount;//总商品数
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shopcart);
initView();
}
private void initView(){
shoppingcatNum = findViewById(R.id.shoppingcatNum);
tv_management = findViewById(R.id.tv_management);
tv_management.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.e("tag","管理");
setActionBarEditor();
}
});
checkAll = findViewById(R.id.checkAll);
checkAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.e("tag","全选");
doCheckAll();
}
});
tv_totalPrice = findViewById(R.id.tv_totalPrice);
btn_settlement = findViewById(R.id.btn_settlement);
btn_settlement.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.e("tag","结算");
}
});
expandableListView = findViewById(R.id.expandableListView);
ShoppingcartStoreInfo shoppingcartStoreInfo1 = new ShoppingcartStoreInfo();
shoppingcartStoreInfo1.setShopName("1号店铺");
shoppingcartStoreInfo1.setEditor(false);
shoppingcartStoreInfo1.setChoosed(false);
ShoppingcartGoodsInfo shoppingcartGoodsInfo1 = new ShoppingcartGoodsInfo();
shoppingcartGoodsInfo1.setGoodsTitle("1号店铺的第一件商品");
shoppingcartGoodsInfo1.setGoodsType("款式:半袖,颜色:白色");
shoppingcartGoodsInfo1.setGoodsPrice(100.00);
shoppingcartGoodsInfo1.setGoodsNum(2);
ShoppingcartGoodsInfo shoppingcartGoodsInfo2 = new ShoppingcartGoodsInfo();
shoppingcartGoodsInfo2.setGoodsTitle("1号店铺的第2件商品");
shoppingcartGoodsInfo2.setGoodsType("款式:半袖,颜色:白色");
shoppingcartGoodsInfo2.setGoodsPrice(34.00);
shoppingcartGoodsInfo2.setGoodsNum(3);
goodsInfoList.add(shoppingcartGoodsInfo1);
goodsInfoList.add(shoppingcartGoodsInfo2);
shoppingcartStoreInfo1.setShopList(goodsInfoList);
List<ShoppingcartGoodsInfo> goodsInfoList2 = new ArrayList<>();
ShoppingcartStoreInfo shoppingcartStoreInfo2 = new ShoppingcartStoreInfo();
shoppingcartStoreInfo2.setShopName("2号店铺");
shoppingcartStoreInfo2.setEditor(false);
shoppingcartStoreInfo2.setChoosed(false);
ShoppingcartGoodsInfo shoppingcartGoodsInfo3 = new ShoppingcartGoodsInfo();
shoppingcartGoodsInfo3.setGoodsTitle("2号店铺的第一件商品");
shoppingcartGoodsInfo3.setGoodsType("款式:短裤,颜色:蓝色");
shoppingcartGoodsInfo3.setGoodsPrice(19.00);
shoppingcartGoodsInfo3.setGoodsNum(5);
ShoppingcartGoodsInfo shoppingcartGoodsInfo4 = new ShoppingcartGoodsInfo();
shoppingcartGoodsInfo4.setGoodsTitle("2号店铺的第2件商品");
shoppingcartGoodsInfo4.setGoodsType("款式:连衣裙,颜色:粉色");
shoppingcartGoodsInfo4.setGoodsPrice(98.00);
shoppingcartGoodsInfo4.setGoodsNum(1);
goodsInfoList2.add(shoppingcartGoodsInfo3);
goodsInfoList2.add(shoppingcartGoodsInfo4);
shoppingcartStoreInfo2.setShopList(goodsInfoList2);
storeInfoList.add(shoppingcartStoreInfo1);
storeInfoList.add(shoppingcartStoreInfo2);
adapter = new ShoppingcartAdapter(this,storeInfoList);
adapter.setCheckInterface(this);
adapter.setGroupEditorListener(this);
adapter.setModifyCountInterface(this);
expandableListView.setAdapter(adapter);
//列表全部展开
for (int i = 0; i < adapter.getGroupCount(); i++) {
expandableListView.expandGroup(i);
}
}
/**
* 右上角编辑按钮
* ActionBar标题上点编辑的时候,只显示每一个店铺的商品修改界面
* ActionBar标题上点完成的时候,只显示每一个店铺的商品信息界面
*/
private void setActionBarEditor() {
for (int i = 0; i < storeInfoList.size(); i++) {
ShoppingcartStoreInfo group = storeInfoList.get(i);
if (group.isActionBarEditor()) {
group.setActionBarEditor(false);
flag = false;
} else {
group.setActionBarEditor(true);
flag = true;
}
setVisiable();
}
adapter.notifyDataSetChanged();
}
private void setVisiable() {
if (flag) {
tv_management.setText("完成");
} else {
tv_management.setText("管理");
}
}
/**
* 删除操作 右上角为编辑状态下,删除按钮(选中删除)
* 1.不要边遍历边删除,容易出现数组越界的情况
* 2.把将要删除的对象放进相应的容器中,待遍历完,用removeAll的方式进行删除
*/
private void doDelete(){
List<ShoppingcartStoreInfo> toBeDeleteGroups = new ArrayList<>(); //待删除的组元素
for (int i = 0; i < storeInfoList.size(); i++) {
ShoppingcartStoreInfo group = storeInfoList.get(i);
if (group.isChoosed()) {
toBeDeleteGroups.add(group);
}
List<ShoppingcartGoodsInfo> toBeDeleteChilds = new ArrayList<>();//待删除的子元素
List<ShoppingcartGoodsInfo> child = storeInfoList.get(i).getShopList();
for (int j = 0; j < child.size(); j++) {
if (child.get(j).isChoosed()) {
toBeDeleteChilds.add(child.get(j));
}
}
child.removeAll(toBeDeleteChilds);
}
storeInfoList.removeAll(toBeDeleteGroups);
//重新设置购物车
// setCartNum();
adapter.notifyDataSetChanged();
}
/**
* 底部左下角全选和反选按钮
* 错误标记:在这里出现过错误
*/
private void doCheckAll() {
for (int i = 0; i < storeInfoList.size(); i++) {
ShoppingcartStoreInfo group = storeInfoList.get(i);
group.setChoosed(checkAll.isChecked());
List<ShoppingcartGoodsInfo> child = storeInfoList.get(i).getShopList();
for (int j = 0; j < child.size(); j++) {
child.get(j).setChoosed(checkAll.isChecked());//这里出现过错误
}
}
adapter.notifyDataSetChanged();
calulate();
}
/**
* 计算商品总价格,操作步骤
* 1.先清空全局计价,计数
* 2.遍历所有的子元素,只要是被选中的,就进行相关的计算操作
* 3.给textView填充数据
*/
private void calulate() {
mtotalPrice = 0.00;
mtotalCount = 0;
for (int i = 0; i < storeInfoList.size(); i++) {
List<ShoppingcartGoodsInfo> child = storeInfoList.get(i).getShopList();
for (int j = 0; j < child.size(); j++) {
ShoppingcartGoodsInfo good = child.get(j);
if (good.isChoosed()) {
mtotalCount++;
mtotalPrice += good.getGoodsPrice() * good.getGoodsNum();
}
}
}
tv_totalPrice.setText("¥" + mtotalPrice + "");
btn_settlement.setText("结算(" + mtotalCount + ")");
if (mtotalCount == 0) {
// setCartNum();
} else {
shoppingcatNum.setText("购物车(" + mtotalCount + ")");//类似淘宝标题栏的购物车数量
}
}
/**
* 组group选中按钮
* @param groupPosition 组元素的位置
* @param isChecked 组元素的选中与否
* 思路:组元素被选中了,那么下辖全部的子元素也被选中
*/
@Override
public void checkGroup(int groupPosition, boolean isChecked) {
List<ShoppingcartGoodsInfo> child = storeInfoList.get(groupPosition).getShopList();
for (int i = 0; i < child.size(); i++) {
child.get(i).setChoosed(isChecked);
}
if (isCheckAll()) {
checkAll.setChecked(true);//全选
} else {
checkAll.setChecked(false);//反选
}
adapter.notifyDataSetChanged();
calulate();
}
/**
* 子child选中按钮
* @param groupPosition 组元素的位置
* @param childPosition 子元素的位置
* @param isChecked 子元素的选中与否
*/
@Override
public void checkChild(int groupPosition, int childPosition, boolean isChecked) {
boolean allChildSameState = true; //判断该组下面的所有子元素是否处于同一状态
List<ShoppingcartGoodsInfo> child = storeInfoList.get(groupPosition).getShopList();
for (int i = 0; i < child.size(); i++) {
//不选全中
if (child.get(i).isChoosed() != isChecked) {
allChildSameState = false;
break;
}
}
if (allChildSameState) {
storeInfoList.get(groupPosition).setChoosed(isChecked);//如果子元素状态相同,那么对应的组元素也设置成这一种的同一状态
} else {
storeInfoList.get(groupPosition).setChoosed(false);//否则一律视为未选中
}
if (isCheckAll()) {
checkAll.setChecked(true);//全选
} else {
checkAll.setChecked(false);//反选
}
adapter.notifyDataSetChanged();
calulate();
}
/**
* 判断所有组的按钮是否全选中
* @return
*/
private boolean isCheckAll(){
boolean childIsChoosed = true;//子商品是否选择
boolean groupIsChoosed = true;//组元素是否选中
for (int i = 0; i < storeInfoList.size();i++){
List<ShoppingcartGoodsInfo> child = storeInfoList.get(i).getShopList();
for (int j = 0; j < child.size(); j++){
if (child.get(j).isChoosed()){
childIsChoosed = true;//已选中
}else {
childIsChoosed = false;//未选中
break;
}
}
if (childIsChoosed){
storeInfoList.get(i).setChoosed(true);//如果子商品全选中,那么此店铺对应的组元素也选中
groupIsChoosed = true;
}else {
storeInfoList.get(i).setChoosed(false);//否则组元素视为未选中
groupIsChoosed = false;
break;
}
}
return groupIsChoosed;
}
/**
* 组的编辑按钮
* @param groupPosition
*/
@Override
public void groupEditor(int groupPosition) {
// setActionBarEditor();
}
/**
* 增加商品按钮
* @param groupPosition 组元素的位置
* @param childPosition 子元素的位置
* @param showCountView 用于展示变化后数量的View
* @param isChecked 子元素选中与否
*/
@Override
public void doIncrease(int groupPosition, int childPosition, View showCountView, boolean isChecked) {
ShoppingcartGoodsInfo good = (ShoppingcartGoodsInfo) adapter.getChild(groupPosition, childPosition);
int count = good.getGoodsNum();
count++;
good.setGoodsNum(count);
((TextView) showCountView).setText(String.valueOf(count));
adapter.notifyDataSetChanged();
calulate();
}
/**
* 减少商品按钮
* @param groupPosition
* @param childPosition
* @param showCountView
* @param isChecked
*/
@Override
public void doDecrease(int groupPosition, int childPosition, View showCountView, boolean isChecked) {
ShoppingcartGoodsInfo good = (ShoppingcartGoodsInfo) adapter.getChild(groupPosition, childPosition);
int count = good.getGoodsNum();
if (Integer.parseInt(((TextView) showCountView).getText().toString()) <= 1 ){
count = 1;
((TextView) showCountView).setText("" + count);
Toast.makeText(this,"不能少于1件",Toast.LENGTH_SHORT).show();
return;
}
count--;
good.setGoodsNum(count);
((TextView) showCountView).setText("" + count);
adapter.notifyDataSetChanged();
calulate();
}
@Override
public void doUpdate(int groupPosition, int childPosition, View showCountView, boolean isChecked) {
}
/**
* 子child中删除按钮
* @param groupPosition
* @param childPosition 思路:当子元素=0,那么组元素也要删除
*/
@Override
public void childDelete(int groupPosition, int childPosition) {
List<ShoppingcartGoodsInfo> child = storeInfoList.get(groupPosition).getShopList();
child.remove(childPosition);
if (child.size() == 0) {
storeInfoList.remove(groupPosition);
}
adapter.notifyDataSetChanged();
calulate();
}
}
以上就是实现购物车基本功能的全部内容,有不足之处欢迎指正。