Android實現(xiàn)簡單購物車
本文實例為大家分享了Android實現(xiàn)簡單購物車的具體代碼,供大家參考,具體內容如下
這里我用到的都是Android自帶SDK中的資源,做了一個極其簡單的購物車實現(xiàn),總結購物車難點包含兩個方面:
1、CheckBox的聯(lián)動:
全選框、商鋪復選框以及商品復選框要做到滴水不漏的聯(lián)動,我的經驗是在監(jiān)聽多選框時盡量采用click事件,避免使用checkChange事件(因為它總是能在你意想不到的地方調用),全選框可以通過商品價格來判斷,這個在代碼中也有體現(xiàn)。
2、數(shù)據(jù)的聯(lián)動和UI的聯(lián)動:
適配器的都是在外部類創(chuàng)建,而總價格等控件都是在調用適配器的地方,這個要做到聯(lián)動,最簡單的方式必然就是接口的回調,熟練使用可以節(jié)省很多代碼,提高編程效率。
再有一個比較容易出現(xiàn)問題的地方就在于,我們經常是首先更改數(shù)據(jù),然后通知適配器刷新數(shù)據(jù)(notifyDataSetChanged()),這里要注意的一點就是在更新數(shù)據(jù)的時候,一定確保更新的傳遞到適配器中的數(shù)據(jù)集合,否則會發(fā)現(xiàn)這個更新適配器的方法是無效的。
其他相關問題代碼中均有體現(xiàn),如果和我一樣是一個編程小白,仔細閱讀會有收獲滴。
代碼中沒有添加自己的資源,邏輯都有實現(xiàn)就是UI丑了一點
activity_main:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout ? ? android:orientation="vertical" ? ? xmlns:android="http://schemas.android.com/apk/res/android" ? ? xmlns:tools="http://schemas.android.com/tools" ? ? android:id="@+id/activity_main" ? ? android:layout_width="match_parent" ? ? android:layout_height="match_parent" ? ? tools:context="com.bwie.test.test1025two.MainActivity"> ? ? <RelativeLayout ? ? ? ? android:layout_gravity="center_horizontal" ? ? ? ? android:background="@color/colorAccent" ? ? ? ? android:layout_width="match_parent" ? ? ? ? android:layout_height="50dp"> ? ? ? ? <TextView ? ? ? ? ? ? android:textSize="38sp" ? ? ? ? ? ? android:gravity="center" ? ? ? ? ? ? android:textColor="#fff" ? ? ? ? ? ? android:text="購物車" ? ? ? ? ? ? android:layout_width="match_parent" ? ? ? ? ? ? android:layout_height="wrap_content" /> ? ? ? ? <TextView ? ? ? ? ? ? android:textColor="#fff" ? ? ? ? ? ? android:textSize="38sp" ? ? ? ? ? ? android:layout_alignParentRight="true" ? ? ? ? ? ? android:text="2" ? ? ? ? ? ? android:id="@+id/main_num" ? ? ? ? ? ? android:layout_width="wrap_content" ? ? ? ? ? ? android:layout_height="wrap_content" /> ? ? </RelativeLayout> ? ? <ExpandableListView ? ? ? ? android:layout_weight="1" ? ? ? ? android:id="@+id/expand_able_view" ? ? ? ? android:layout_width="match_parent" ? ? ? ? android:layout_height="match_parent"/> ? ? <LinearLayout ? ? ? ? android:layout_width="match_parent" ? ? ? ? android:layout_height="wrap_content"> ? ? ? ? <CheckBox ? ? ? ? ? ? android:layout_weight="1" ? ? ? ? ? ? android:id="@+id/main_check_all" ? ? ? ? ? ? android:text="全選" ? ? ? ? ? ? android:layout_width="0dp" ? ? ? ? ? ? android:layout_height="wrap_content" /> ? ? ? ? <TextView ? ? ? ? ? ? android:id="@+id/main_price" ? ? ? ? ? ? android:gravity="center_horizontal" ? ? ? ? ? ? android:text="0" ? ? ? ? ? ? android:layout_weight="1" ? ? ? ? ? ? android:layout_width="0dp" ? ? ? ? ? ? android:layout_height="wrap_content" /> ? ? ? ? <Button ? ? ? ? ? ? android:id="@+id/btn_delete" ? ? ? ? ? ? android:background="#aaa" ? ? ? ? ? ? android:layout_weight="1" ? ? ? ? ? ? android:text="刪除" ? ? ? ? ? ? android:layout_width="0dp" ? ? ? ? ? ? android:layout_height="wrap_content" /> ? ? ? ? <Button ? ? ? ? ? ? android:id="@+id/btn_buy" ? ? ? ? ? ? android:background="#f99" ? ? ? ? ? ? android:layout_weight="1" ? ? ? ? ? ? android:text="購買" ? ? ? ? ? ? android:layout_width="0dp" ? ? ? ? ? ? android:layout_height="wrap_content" /> ? ? </LinearLayout> </LinearLayout>
group_item:
注:這里圖了個簡單,商鋪名稱我是通過設置CheckBox的text來顯示的,另外取消焦點是為了不影響二級列表的點擊展開與收回子集列表
<?xml version="1.0" encoding="utf-8"?> <LinearLayout ? ? android:orientation="horizontal" ? ? xmlns:android="http://schemas.android.com/apk/res/android" ? ? android:layout_width="match_parent" ? ? android:layout_height="match_parent"> ? ? <CheckBox ? ? ? ? android:focusable="false" ? ? ? ? android:id="@+id/group_check" ? ? ? ? android:layout_width="wrap_content" ? ? ? ? android:layout_height="wrap_content" /> </LinearLayout>
child_item:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout ? ? android:orientation="horizontal" ? ? xmlns:android="http://schemas.android.com/apk/res/android" ? ? android:layout_width="match_parent" ? ? android:layout_height="match_parent"> ? ? <CheckBox ? ? ? ? android:id="@+id/child_check" ? ? ? ? android:layout_width="wrap_content" ? ? ? ? android:layout_height="wrap_content" /> ? ? <ImageView ? ? ? ? android:id="@+id/child_img" ? ? ? ? android:scaleType="center" ? ? ? ? android:src="@mipmap/ic_launcher" ? ? ? ? android:layout_width="80dp" ? ? ? ? android:layout_height="80dp" /> ? ? <TextView ? ? ? ? android:id="@+id/child_price" ? ? ? ? android:textSize="22sp" ? ? ? ? android:textColor="@color/colorPrimary" ? ? ? ? android:text="2888" ? ? ? ? android:layout_width="wrap_content" ? ? ? ? android:layout_height="80dp" /> ? ? <RelativeLayout ? ? ? ? android:layout_weight="1" ? ? ? ? android:layout_width="match_parent" ? ? ? ? android:layout_height="80dp"> ? ? ? ? <TextView ? ? ? ? ? ? android:text="名字" ? ? ? ? ? ? android:id="@+id/child_name" ? ? ? ? ? ? android:layout_width="wrap_content" ? ? ? ? ? ? android:layout_height="wrap_content" /> ? ? ? ? <LinearLayout ? ? ? ? ? ? android:orientation="horizontal" ? ? ? ? ? ? android:layout_alignParentBottom="true" ? ? ? ? ? ? android:layout_width="wrap_content" ? ? ? ? ? ? android:layout_height="wrap_content"> ? ? ? ? ? ? <TextView ? ? ? ? ? ? ? ? android:id="@+id/child_jian" ? ? ? ? ? ? ? ? android:gravity="center_horizontal" ? ? ? ? ? ? ? ? android:text="—" ? ? ? ? ? ? ? ? android:layout_width="30dp" ? ? ? ? ? ? ? ? android:layout_height="30dp" /> ? ? ? ? ? ? <TextView ? ? ? ? ? ? ? ? android:gravity="center_horizontal" ? ? ? ? ? ? ? ? android:text="2" ? ? ? ? ? ? ? ? android:id="@+id/child_num" ? ? ? ? ? ? ? ? android:layout_width="30dp" ? ? ? ? ? ? ? ? android:layout_height="30dp" /> ? ? ? ? ? ? <TextView ? ? ? ? ? ? ? ? android:id="@+id/child_jia" ? ? ? ? ? ? ? ? android:gravity="center_horizontal" ? ? ? ? ? ? ? ? android:text="+" ? ? ? ? ? ? ? ? android:layout_width="30dp" ? ? ? ? ? ? ? ? android:layout_height="30dp" /> ? ? ? ? </LinearLayout> ? ? </RelativeLayout> </LinearLayout>
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<Child> children; ? ? public Group(String name, boolean check,ArrayList<Child> 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<Child> children){ ? ? ? ? this.children = children; ? ? } ? ? public ArrayList<Child> getChildren(){ ? ? ? ? return children; ? ? } ? ? @Override ? ? public 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; ? ? } ? ? @Override ? ? public 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<Group> groups; ? ? public MyAdapter(Context context, ArrayList<Group> groups) { ? ? ? ? this.context = context; ? ? ? ? this.groups = groups; ? ? } ? ? //監(jiān)聽加減事件回調接口 ? ? public interface onNumChangeListener{ ? ? ? ? void onNumChange(int groupID,int childID,boolean isAdd); ? ? } ? ? private onNumChangeListener mOnNumChangeListener; ? ? public void setOnNumChangeListener(onNumChangeListener mOnNumChangeListener){ ? ? ? ? this.mOnNumChangeListener = mOnNumChangeListener; ? ? } ? ? //監(jiān)聽多選框點擊事件回調接口。 ? ? public interface onCheckChangeListener{ ? ? ? ? void onGroupClick(int groupID); ? ? ? ? void onChildClick(int groupID,int childID); ? ? } ? ? private onCheckChangeListener mOnCheckChangeListener; ? ? public void setmOnCheckChangeListener(onCheckChangeListener mOnCheckChangeListener){ ? ? ? ? this.mOnCheckChangeListener = mOnCheckChangeListener; ? ? } ? ? //監(jiān)聽價格需要更新回調接口 ? ? public interface onShouldChangeMoneyListener{ ? ? ? ? void onShouldChnageMoney(); ? ? } ? ? private onShouldChangeMoneyListener mOnShouldChangeMoneyListener; ? ? public void setmOnShouldChangeMoneyListener(onShouldChangeMoneyListener mOnShouldChangeMoneyListener){ ? ? ? ? this.mOnShouldChangeMoneyListener = mOnShouldChangeMoneyListener; ? ? } ? ? @Override ? ? public int getGroupCount() { ? ? ? ? return groups.size(); ? ? } ? ? @Override ? ? public int getChildrenCount(int i) { ? ? ? ? return groups.get(i).getChildren().size(); ? ? } ? ? @Override ? ? public Object getGroup(int i) { ? ? ? ? return groups.get(i); ? ? } ? ? @Override ? ? public Object getChild(int i, int i1) { ? ? ? ? return groups.get(i).getChildren().get(i1); ? ? } ? ? @Override ? ? public long getGroupId(int i) { ? ? ? ? return i; ? ? } ? ? @Override ? ? public long getChildId(int i, int i1) { ? ? ? ? return i1; ? ? } ? ? @Override ? ? public boolean hasStableIds() { ? ? ? ? return false; ? ? } ? ? @Override ? ? public 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() { ? ? ? ? ? ? ? ? @Override ? ? ? ? ? ? ? ? public void onClick(View view) { ? ? ? ? ? ? ? ? ? ? mOnCheckChangeListener.onGroupClick(i); ? ? ? ? ? ? ? ? ? ? mOnShouldChangeMoneyListener.onShouldChnageMoney(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? }); ? ? ? ? } ? ? ? ? return view; ? ? } ? ? @Override ? ? public 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() { ? ? ? ? ? ? ? ? @Override ? ? ? ? ? ? ? ? public void onClick(View view) { ? ? ? ? ? ? ? ? ? ? mOnNumChangeListener.onNumChange(i,i1,false); ? ? ? ? ? ? ? ? ? ? mOnShouldChangeMoneyListener.onShouldChnageMoney(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? }); ? ? ? ? } ? ? ? ? if (mOnNumChangeListener != null&&mOnShouldChangeMoneyListener != null){ ? ? ? ? ? ? holder.jia.setOnClickListener(new View.OnClickListener() { ? ? ? ? ? ? ? ? @Override ? ? ? ? ? ? ? ? public void onClick(View view) { ? ? ? ? ? ? ? ? ? ? mOnNumChangeListener.onNumChange(i,i1,true); ? ? ? ? ? ? ? ? ? ? mOnShouldChangeMoneyListener.onShouldChnageMoney(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? }); ? ? ? ? } ? ? ? ? if (mOnCheckChangeListener != null&&mOnShouldChangeMoneyListener != null){ ? ? ? ? ? ? holder.checkBox.setOnClickListener(new View.OnClickListener() { ? ? ? ? ? ? ? ? @Override ? ? ? ? ? ? ? ? public void onClick(View view) { ? ? ? ? ? ? ? ? ? ? mOnCheckChangeListener.onChildClick(i,i1); ? ? ? ? ? ? ? ? ? ? mOnShouldChangeMoneyListener.onShouldChnageMoney(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? }); ? ? ? ? } ? ? ? ? return view; ? ? } ? ? @Override ? ? public 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;//右上角當前商品數(shù)量和底部當前已選中商品的價格 ? ? ExpandableListView expandableListView;//展示商品信息的二級列表 ? ? CheckBox checkAll;//左下角全選 ? ? Button btnDel,btnBuy;//底部刪除當前選中按鈕、購買按鈕 ? ? ArrayList<Group> groups = new ArrayList<>();//數(shù)據(jù)源集合 ? ? MyAdapter adapter;//自定義baseExpandable適配器 ? ? @Override ? ? protected void onCreate(Bundle savedInstanceState) { ? ? ? ? super.onCreate(savedInstanceState); ? ? ? ? setContentView(R.layout.activity_main); ? ? ? ? initView();//控件初始化 ? ? ? ? initData();//數(shù)據(jù)初始化 ? ? ? ? changeGoodsNum();//初始化當前商品個數(shù)。 ? ? ? ? /** ? ? ? ? ?* 自定義加減按鈕回調 ? ? ? ? ?* params: groupID:商鋪id ?childID:商品在當前商鋪的id isADD:非加即減 ? ? ? ? ?*/ ? ? ? ? adapter.setOnNumChangeListener(new MyAdapter.onNumChangeListener() { ? ? ? ? ? ? @Override ? ? ? ? ? ? public void onNumChange(int groupID, int childID, boolean isAdd) { ? ? ? ? ? ? ? ? //獲得當前點擊商品的數(shù)量 ? ? ? ? ? ? ? ? int num = groups.get(groupID).getChildren().get(childID).getNum(); ? ? ? ? ? ? ? ? if (isAdd){//加 ? ? ? ? ? ? ? ? ? ? //在數(shù)據(jù)源中該商品數(shù)量自增1 ? ? ? ? ? ? ? ? ? ? groups.get(groupID).getChildren().get(childID).setNum(++num); ? ? ? ? ? ? ? ? }else{//減 ? ? ? ? ? ? ? ? ? ? if (num == 1){//數(shù)量為1給出提示 ? ? ? ? ? ? ? ? ? ? ? ? Toast.makeText(MainActivity.this, "受不了了,不能再少了", Toast.LENGTH_SHORT).show(); ? ? ? ? ? ? ? ? ? ? }else{//在數(shù)據(jù)源中該商品數(shù)量自減1 ? ? ? ? ? ? ? ? ? ? ? ? groups.get(groupID).getChildren().get(childID).setNum(--num); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? //更新UI ? ? ? ? ? ? ? ? adapter.notifyDataSetChanged(); ? ? ? ? ? ? ? ? changeMoney();//更新價格顯示 ? ? ? ? ? ? } ? ? ? ? }); ? ? ? ? //自定義商鋪和商品多選框點擊回調 ? ? ? ? adapter.setmOnCheckChangeListener(new MyAdapter.onCheckChangeListener() { ? ? ? ? ? ? @Override ? ? ? ? ? ? public void onGroupClick(int groupID) {//組點擊 ? ? ? ? ? ? ? ? //將數(shù)據(jù)源置反,以保持同步 ? ? ? ? ? ? ? ? groups.get(groupID).setCheck(!(groups.get(groupID).isCheck())); ? ? ? ? ? ? ? ? //獲取當前選中狀態(tài) ? ? ? ? ? ? ? ? boolean flag = groups.get(groupID).isCheck(); ? ? ? ? ? ? ? ? //更新其下所有商品CheckBox ? ? ? ? ? ? ? ? for (int i = 0 ; i < groups.get(groupID).getChildren().size(); i++){ ? ? ? ? ? ? ? ? ? ? groups.get(groupID).getChildren().get(i).setCheck(flag); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? //更新UI ? ? ? ? ? ? ? ? adapter.notifyDataSetChanged(); ? ? ? ? ? ? ? ? //更新價格顯示 ? ? ? ? ? ? ? ? changeMoney(); ? ? ? ? ? ? } ? ? ? ? ? ? @Override ? ? ? ? ? ? public void onChildClick(int groupID, int childID) {//商品點擊 ? ? ? ? ? ? ? ? //將數(shù)據(jù)源置反以保持同步 ? ? ? ? ? ? ? ? groups.get(groupID).getChildren().get(childID).setCheck(!(groups.get(groupID).getChildren().get(childID).isCheck())); ? ? ? ? ? ? ? ? //判斷該條目及所有兄弟條目是否全部選中,以及時更新商鋪CheckBox ? ? ? ? ? ? ? ? int flag = 0; ? ? ? ? ? ? ? ? for (int i = 0 ; i < groups.get(groupID).getChildren().size() ; i++){ ? ? ? ? ? ? ? ? ? ? if (groups.get(groupID).getChildren().get(i).isCheck()){ ? ? ? ? ? ? ? ? ? ? ? ? flag++; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? //如果該組下的選中數(shù)量與該集合長度相等,說明全部選中,更新組CheckBox ? ? ? ? ? ? ? ? if (flag == groups.get(groupID).getChildren().size()){ ? ? ? ? ? ? ? ? ? ? groups.get(groupID).setCheck(true); ? ? ? ? ? ? ? ? }else{ ? ? ? ? ? ? ? ? ? ? groups.get(groupID).setCheck(false); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? //更新UI ? ? ? ? ? ? ? ? adapter.notifyDataSetChanged(); ? ? ? ? ? ? ? ? //更新價格顯示 ? ? ? ? ? ? ? ? changeMoney(); ? ? ? ? ? ? } ? ? ? ? }); ? ? ? ? //刪除按鈕點擊 ? ? ? ? btnDel.setOnClickListener(new View.OnClickListener() { ? ? ? ? ? ? @Override ? ? ? ? ? ? public void onClick(View view) { ? ? ? ? ? ? ? ? List<Group> toBeDeleteGroups = new ArrayList<Group>();// 待刪除的組元素列表 ? ? ? ? ? ? ? ? for (int i = 0; i < groups.size(); i++) { ? ? ? ? ? ? ? ? ? ? Group group = groups.get(i); ? ? ? ? ? ? ? ? ? ? if (group.isCheck()) { ? ? ? ? ? ? ? ? ? ? ? ? toBeDeleteGroups.add(group); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? List<Child> toBeDeleteChildren = new ArrayList<Child>();// 待刪除的子元素列表 ? ? ? ? ? ? ? ? ? ? List<Child> 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); ? ? ? ? ? ? ? ? //更新UI ? ? ? ? ? ? ? ? adapter.notifyDataSetChanged(); ? ? ? ? ? ? ? ? //更新當前商品數(shù)量顯示 ? ? ? ? ? ? ? ? changeGoodsNum(); ? ? ? ? ? ? ? ? //更新當前價格顯示 ? ? ? ? ? ? ? ? changeMoney(); ? ? ? ? ? ? } ? ? ? ? }); ? ? ? ? //購買按鈕,點擊提示當前選中金額 ? ? ? ? btnBuy.setOnClickListener(new View.OnClickListener() { ? ? ? ? ? ? @Override ? ? ? ? ? ? public void onClick(View view) { ? ? ? ? ? ? ? ? String money = price.getText().toString(); ? ? ? ? ? ? ? ? Toast.makeText(MainActivity.this, "當前總金額:"+money, Toast.LENGTH_SHORT).show(); ? ? ? ? ? ? } ? ? ? ? }); ? ? ? ? //全選按鈕,點擊更新視圖所有CheckBox ? ? ? ? checkAll.setOnClickListener(new View.OnClickListener() { ? ? ? ? ? ? @Override ? ? ? ? ? ? public 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()); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? //更新UI ? ? ? ? ? ? ? ? adapter.notifyDataSetChanged(); ? ? ? ? ? ? ? ? //更新總價顯示 ? ? ? ? ? ? ? ? changeMoney(); ? ? ? ? ? ? } ? ? ? ? }); ? ? ? ? //自定義回調更新總價 ? ? ? ? adapter.setmOnShouldChangeMoneyListener(new MyAdapter.onShouldChangeMoneyListener() { ? ? ? ? ? ? @Override ? ? ? ? ? ? public void onShouldChnageMoney() { ? ? ? ? ? ? ? ? //更新總價顯示 ? ? ? ? ? ? ? ? changeMoney(); ? ? ? ? ? ? } ? ? ? ? }); ? ? } ? ? //初始化數(shù)據(jù),設置適配器 ? ? private void initData() { ? ? ? ? for (int i = 0 ; i < 5 ; i++){ ? ? ? ? ? ? ArrayList<Child> 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以展開的方式呈現(xiàn) ? ? ? ? } ? ? } ? ? //獲得控件資源 ? ? 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); ? ? } ? ? //當前購物車商品數(shù)量 ? ? 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實現(xiàn)類似于PC中的右鍵彈出菜單效果
這篇文章主要介紹了Android實現(xiàn)類似于PC中的右鍵彈出菜單效果,需要的朋友可以參考下2015-12-12Android 6.0上sdcard和U盤路徑獲取和區(qū)分方法
今天小編就為大家分享一篇Android 6.0上sdcard和U盤路徑獲取和區(qū)分方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08Android中ViewPager帶來的滑動卡頓問題解決要點解析
這里我們主要針對ViewGroup的SwipeRefreshLayout中引入ViewPager所引起的滑動沖突問題進行討論,一起來看一下Android中ViewPager帶來的滑動卡頓問題解決要點解析:2016-06-06Android神兵利器之Image Asset Studio的實現(xiàn)
這篇文章主要介紹了Android神兵利器之Image Asset Studio的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06Android?kotlin?跳轉手機熱點開關頁面和判斷熱點是否打開(親測可用)
跳轉手機熱點的頁面肯定是用intent,重點是action不知道是什么,網上最常見的就是Settings.ACTION_WIFI_SETTINGS 跳轉wifi設置頁面,本文介紹Android?kotlin?跳轉手機熱點開關頁面和判斷熱點是否打開,感興趣的朋友一起看看吧2023-08-08