Android实现简单购物车

本文实例为大家分享了Android实现简单购物车的具体代码,供大家参考,具体内容如下
这里我用到的都是Android自带SDK中的资源,做了一个极其简单的购物车实现,总结购物车难点包含两个方面:
1、CheckBox的联动:
【Android实现简单购物车】全选框、商铺复选框以及商品复选框要做到滴水不漏的联动,我的经验是在监听多选框时尽量采用click事件,避免使用checkChange事件(因为它总是能在你意想不到的地方调用),全选框可以通过商品价格来判断,这个在代码中也有体现。
2、数据的联动和UI的联动:
适配器的都是在外部类创建,而总价格等控件都是在调用适配器的地方,这个要做到联动,最简单的方式必然就是接口的回调,熟练使用可以节省很多代码,提高编程效率。
再有一个比较容易出现问题的地方就在于,我们经常是首先更改数据,然后通知适配器刷新数据(notifyDataSetChanged()),这里要注意的一点就是在更新数据的时候,一定确保更新的传递到适配器中的数据集合,否则会发现这个更新适配器的方法是无效的。
其他相关问题代码中均有体现,如果和我一样是一个编程小白,仔细阅读会有收获滴。
代码中没有添加自己的资源,逻辑都有实现就是UI丑了一点
activity_main:


group_item:
注:这里图了个简单,商铺名称我是通过设置CheckBox的text来显示的,另外取消焦点是为了不影响二级列表的点击展开与收回子集列表

child_item:

groupBean:
package com.bwie.test.test1025two; import java.util.ArrayList; /** * Created by Zzw on 2017/10/25. */public class Group {private String name; private boolean check; private ArrayList children; public Group(String name, boolean check,ArrayList children) {this.name = name; this.check = check; this.children = children; }public Group() {}public String getName() {return name; }public void setName(String name) {this.name = name; }public boolean isCheck() {return check; }public void setCheck(boolean check) {this.check = check; }public void setChildren(ArrayList children){this.children = children; }public ArrayList getChildren(){return children; }@Overridepublic String toString() {return "Group{" +"name='" + name + '\'' +", check=" + check +'}'; }}

childBean:
package com.bwie.test.test1025two; /** * Created by Zzw on 2017/10/25. */public class Child {private String name; private String img; private int num; private boolean check; private int price; public Child(String name, String img, int num, boolean check, int price) {this.name = name; this.img = img; this.num = num; this.check = check; this.price = price; }public Child() {}public String getName() {return name; }public void setName(String name) {this.name = name; }public String getImg() {return img; }public void setImg(String img) {this.img = img; }public int getNum() {return num; }public void setNum(int num) {this.num = num; }public boolean isCheck() {return check; }public void setCheck(boolean check) {this.check = check; }public int getPrice() {return price; }public void setPrice(int price) {this.price = price; }@Overridepublic String toString() {return "Child{" +"name='" + name + '\'' +", img='" + img + '\'' +", num=" + num +", check=" + check +", price=" + price +'}'; }}

MyAdapter:
package com.bwie.test.test1025two; 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 java.util.ArrayList; /** * Created by Zzw on 2017/10/25. */public class MyAdapter extends BaseExpandableListAdapter {Context context; ArrayList groups; public MyAdapter(Context context, ArrayList groups) {this.context = context; this.groups = groups; }//监听加减事件回调接口public interface onNumChangeListener{void onNumChange(int groupID,int childID,boolean isAdd); }private onNumChangeListener mOnNumChangeListener; public void setOnNumChangeListener(onNumChangeListener mOnNumChangeListener){this.mOnNumChangeListener = mOnNumChangeListener; }//监听多选框点击事件回调接口。public interface onCheckChangeListener{void onGroupClick(int groupID); void onChildClick(int groupID,int childID); }private onCheckChangeListener mOnCheckChangeListener; public void setmOnCheckChangeListener(onCheckChangeListener mOnCheckChangeListener){this.mOnCheckChangeListener = mOnCheckChangeListener; }//监听价格需要更新回调接口public interface onShouldChangeMoneyListener{void onShouldChnageMoney(); }private onShouldChangeMoneyListener mOnShouldChangeMoneyListener; public void setmOnShouldChangeMoneyListener(onShouldChangeMoneyListener mOnShouldChangeMoneyListener){this.mOnShouldChangeMoneyListener = mOnShouldChangeMoneyListener; }@Overridepublic int getGroupCount() {return groups.size(); }@Overridepublic int getChildrenCount(int i) {return groups.get(i).getChildren().size(); }@Overridepublic Object getGroup(int i) {return groups.get(i); }@Overridepublic Object getChild(int i, int i1) {return groups.get(i).getChildren().get(i1); }@Overridepublic long getGroupId(int i) {return i; }@Overridepublic long getChildId(int i, int i1) {return i1; }@Overridepublic boolean hasStableIds() {return false; }@Overridepublic View getGroupView(final int i, boolean b, View view, ViewGroup viewGroup) {GroupHolder holder = null; if (view == null){view = LayoutInflater.from(context).inflate(R.layout.group_item,viewGroup,false); holder= new GroupHolder(); holder.checkBox = (CheckBox) view.findViewById(R.id.group_check); view.setTag(holder); }else{holder = (GroupHolder) view.getTag(); }holder.checkBox.setText(groups.get(i).getName()); holder.checkBox.setChecked(groups.get(i).isCheck()); if (mOnCheckChangeListener != null&&mOnShouldChangeMoneyListener != null){holder.checkBox.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mOnCheckChangeListener.onGroupClick(i); mOnShouldChangeMoneyListener.onShouldChnageMoney(); }}); }return view; }@Overridepublic View getChildView(final int i,final int i1, boolean b, View view, ViewGroup viewGroup) {ChildHolder holder = null; if (view == null){view = LayoutInflater.from(context).inflate(R.layout.child_item,viewGroup,false); holder = new ChildHolder(); holder.checkBox = (CheckBox) view.findViewById(R.id.child_check); holder.imageView = (ImageView) view.findViewById(R.id.child_img); holder.name = (TextView) view.findViewById(R.id.child_name); holder.num = (TextView) view.findViewById(R.id.child_num); holder.jian = (TextView) view.findViewById(R.id.child_jian); holder.jia = (TextView) view.findViewById(R.id.child_jia); holder.price = (TextView) view.findViewById(R.id.child_price); view.setTag(holder); }else{holder = (ChildHolder) view.getTag(); }holder.checkBox.setChecked(groups.get(i).getChildren().get(i1).isCheck()); holder.imageView.setImageResource(R.mipmap.ic_launcher); holder.name.setText(groups.get(i).getChildren().get(i1).getName()); holder.num.setText(groups.get(i).getChildren().get(i1).getNum()+""); holder.price.setText(groups.get(i).getChildren().get(i1).getPrice()+""); if (mOnNumChangeListener != null&&mOnShouldChangeMoneyListener != null){holder.jian.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mOnNumChangeListener.onNumChange(i,i1,false); mOnShouldChangeMoneyListener.onShouldChnageMoney(); }}); }if (mOnNumChangeListener != null&&mOnShouldChangeMoneyListener != null){holder.jia.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mOnNumChangeListener.onNumChange(i,i1,true); mOnShouldChangeMoneyListener.onShouldChnageMoney(); }}); }if (mOnCheckChangeListener != null&&mOnShouldChangeMoneyListener != null){holder.checkBox.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mOnCheckChangeListener.onChildClick(i,i1); mOnShouldChangeMoneyListener.onShouldChnageMoney(); }}); }return view; }@Overridepublic boolean isChildSelectable(int i, int i1) {return true; }class GroupHolder {CheckBox checkBox; }class ChildHolder{CheckBox checkBox; ImageView imageView; TextView name,num,jian,jia,price; }}

MainActivity:
package com.bwie.test.test1025two; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; 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 java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity {TextView num,price; //右上角当前商品数量和底部当前已选中商品的价格ExpandableListView expandableListView; //展示商品信息的二级列表CheckBox checkAll; //左下角全选Button btnDel,btnBuy; //底部删除当前选中按钮、购买按钮ArrayList groups = new ArrayList<>(); //数据源集合MyAdapter adapter; //自定义baseExpandable适配器@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); //控件初始化initData(); //数据初始化changeGoodsNum(); //初始化当前商品个数。/*** 自定义加减按钮回调* params: groupID:商铺idchildID:商品在当前商铺的id isADD:非加即减*/adapter.setOnNumChangeListener(new MyAdapter.onNumChangeListener() {@Overridepublic void onNumChange(int groupID, int childID, boolean isAdd) {//获得当前点击商品的数量int num = groups.get(groupID).getChildren().get(childID).getNum(); if (isAdd){//加//在数据源中该商品数量自增1groups.get(groupID).getChildren().get(childID).setNum(++num); }else{//减if (num == 1){//数量为1给出提示Toast.makeText(MainActivity.this, "受不了了,不能再少了", Toast.LENGTH_SHORT).show(); }else{//在数据源中该商品数量自减1groups.get(groupID).getChildren().get(childID).setNum(--num); }}//更新UIadapter.notifyDataSetChanged(); changeMoney(); //更新价格显示}}); //自定义商铺和商品多选框点击回调adapter.setmOnCheckChangeListener(new MyAdapter.onCheckChangeListener() {@Overridepublic void onGroupClick(int groupID) {//组点击//将数据源置反,以保持同步groups.get(groupID).setCheck(!(groups.get(groupID).isCheck())); //获取当前选中状态boolean flag = groups.get(groupID).isCheck(); //更新其下所有商品CheckBoxfor (int i = 0 ; i < groups.get(groupID).getChildren().size(); i++){groups.get(groupID).getChildren().get(i).setCheck(flag); }//更新UIadapter.notifyDataSetChanged(); //更新价格显示changeMoney(); }@Overridepublic void onChildClick(int groupID, int childID) {//商品点击//将数据源置反以保持同步groups.get(groupID).getChildren().get(childID).setCheck(!(groups.get(groupID).getChildren().get(childID).isCheck())); //判断该条目及所有兄弟条目是否全部选中,以及时更新商铺CheckBoxint flag = 0; for (int i = 0 ; i < groups.get(groupID).getChildren().size() ; i++){if (groups.get(groupID).getChildren().get(i).isCheck()){flag++; }}//如果该组下的选中数量与该集合长度相等,说明全部选中,更新组CheckBoxif (flag == groups.get(groupID).getChildren().size()){groups.get(groupID).setCheck(true); }else{groups.get(groupID).setCheck(false); }//更新UIadapter.notifyDataSetChanged(); //更新价格显示changeMoney(); }}); //删除按钮点击btnDel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {List toBeDeleteGroups = new ArrayList(); // 待删除的组元素列表for (int i = 0; i < groups.size(); i++) {Group group = groups.get(i); if (group.isCheck()) {toBeDeleteGroups.add(group); }List toBeDeleteChildren = new ArrayList(); // 待删除的子元素列表List childs = group.getChildren(); for (int j = 0; j < childs.size(); j++) {if (childs.get(j).isCheck()) {toBeDeleteChildren.add(childs.get(j)); }}childs.removeAll(toBeDeleteChildren); }groups.removeAll(toBeDeleteGroups); //更新UIadapter.notifyDataSetChanged(); //更新当前商品数量显示changeGoodsNum(); //更新当前价格显示changeMoney(); }}); //购买按钮,点击提示当前选中金额btnBuy.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String money = price.getText().toString(); Toast.makeText(MainActivity.this, "当前总金额:"+money, Toast.LENGTH_SHORT).show(); }}); //全选按钮,点击更新视图所有CheckBoxcheckAll.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {for (int i = 0 ; i< groups.size() ; i++){groups.get(i).setCheck(checkAll.isChecked()); for (int j = 0 ; j < groups.get(i).getChildren().size() ; j ++){groups.get(i).getChildren().get(j).setCheck(checkAll.isChecked()); }}//更新UIadapter.notifyDataSetChanged(); //更新总价显示changeMoney(); }}); //自定义回调更新总价adapter.setmOnShouldChangeMoneyListener(new MyAdapter.onShouldChangeMoneyListener() {@Overridepublic void onShouldChnageMoney() {//更新总价显示changeMoney(); }}); }//初始化数据,设置适配器private void initData() {for (int i = 0 ; i < 5 ; i++){ArrayList children = new ArrayList<>(); for (int j = 0 ; j <= i ; j++){children.add(new Child("店铺"+i+"的商品:"+j,"",2,false,j+1)); }groups.add(new Group("商铺:"+i,false,children)); }adapter = new MyAdapter(this,groups); expandableListView.setAdapter(adapter); for (int i = 0; i < groups.size(); i++){expandableListView.expandGroup(i); // 初始化时,将ExpandableListView以展开的方式呈现}}//获得控件资源private void initView() {num = (TextView) findViewById(R.id.main_num); expandableListView = (ExpandableListView) findViewById(R.id.expand_able_view); checkAll = (CheckBox) findViewById(R.id.main_check_all); btnDel = (Button) findViewById(R.id.btn_delete); btnBuy = (Button) findViewById(R.id.btn_buy); price = (TextView) findViewById(R.id.main_price); }//当前购物车商品数量private void changeGoodsNum(){int currentNum = 0; for (int i = 0 ; i < groups.size(); i++){for (int j = 0 ; j < groups.get(i).getChildren().size(); j++){currentNum++; }}num.setText(currentNum+""); }//更新总价private void changeMoney(){int money = 0; int allMoney = 0; //获得当前全部商品价格for (int i = 0 ; i < groups.size(); i++){for (int j = 0 ; j < groups.get(i).getChildren().size(); j++){if (groups.get(i).getChildren().get(j).isCheck()){money += groups.get(i).getChildren().get(j).getNum() * groups.get(i).getChildren().get(j).getPrice(); }allMoney += groups.get(i).getChildren().get(j).getNum() * groups.get(i).getChildren().get(j).getPrice(); }}//当选中价格与全部价格相等,更新全选框if (money == allMoney){checkAll.setChecked(true); }else{checkAll.setChecked(false); }price.setText(money + ""); }}

效果图:
Android实现简单购物车
文章图片

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    推荐阅读