转自:http://blog.csdn.net/u011011744/article/details/53538972先看看效果吧!

目前我做的功能除了结算就这些了…

下面开始来看代码

Activity界面是这样的

首先是Activity 布局xml

[html] view plaincopyprint?
  1. <?xml version=“1.0” encoding=“utf-8”?>
  2. <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
  3. android:layout_width=“match_parent”
  4. android:layout_height=“match_parent”
  5. android:orientation=“vertical”>
  6. <include
  7. android:id=“@+id/shopping_title”
  8. layout=“@layout/layout_title” />
  9. <TextView
  10. android:id=“@+id/tv_edit”
  11. android:layout_width=“wrap_content”
  12. android:layout_height=“25dp”
  13. android:layout_gravity=“right”
  14. android:layout_margin=“10dp”
  15. android:text=“编辑”
  16. android:textSize=“18dp” />
  17. <View
  18. android:layout_width=“match_parent”
  19. android:layout_height=“1dp”
  20. android:layout_below=“@id/tv_edit”
  21. android:background=“@color/gray3” />
  22. <ListView
  23. android:id=“@+id/list_shopping_cart”
  24. android:layout_width=“match_parent”
  25. android:layout_height=“0dp”
  26. android:layout_below=“@id/tv_edit”
  27. android:layout_weight=“1”
  28. android:scrollbars=“none” />
  29. <View
  30. android:layout_width=“match_parent”
  31. android:layout_height=“1dp”
  32. android:background=“@color/gray3” />
  33. <RelativeLayout
  34. android:id=“@+id/rl_bottom”
  35. android:layout_width=“match_parent”
  36. android:layout_height=“50dp”
  37. android:layout_alignParentBottom=“true”
  38. android:background=“@color/white”>
  39. <CheckBox
  40. android:id=“@+id/ck_all”
  41. android:layout_width=“wrap_content”
  42. android:layout_height=“match_parent”
  43. android:layout_centerVertical=“true”
  44. android:button=“@drawable/check_box_style”
  45. android:checkMark=“?android:attr/listChoiceIndicatorMultiple”
  46. android:gravity=“center”
  47. android:paddingLeft=“10dp”
  48. android:scaleX=“0.6”
  49. android:scaleY=“0.6”
  50. android:text=“全选”
  51. android:textAppearance=“?android:attr/textAppearanceLarge”
  52. android:textColor=“@color/desccolor” />
  53. <TextView
  54. android:id=“@+id/tv_settlement”
  55. android:layout_width=“80dp”
  56. android:layout_height=“match_parent”
  57. android:layout_alignParentRight=“true”
  58. android:background=“@color/desccolor”
  59. android:gravity=“center”
  60. android:text=“结算(0)”
  61. android:textColor=“@color/white” />
  62. <TextView
  63. android:id=“@+id/tv_show_price”
  64. android:layout_width=“wrap_content”
  65. android:layout_height=“match_parent”
  66. android:layout_toLeftOf=“@id/tv_settlement”
  67. android:gravity=“center”
  68. android:padding=“5dp”
  69. android:text=“合计:0.00”
  70. android:textColor=“@color/desccolor” />
  71. </RelativeLayout>
  72. </LinearLayout>
<?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:orientation=”vertical”>
&lt;includeandroid:id="@+id/shopping_title"layout="@layout/layout_title" /&gt;&lt;TextViewandroid:id="@+id/tv_edit"android:layout_width="wrap_content"android:layout_height="25dp"android:layout_gravity="right"android:layout_margin="10dp"android:text="编辑"android:textSize="18dp" /&gt;&lt;Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:layout_below="@id/tv_edit"android:background="@color/gray3" /&gt;&lt;ListViewandroid:id="@+id/list_shopping_cart"android:layout_width="match_parent"android:layout_height="0dp"android:layout_below="@id/tv_edit"android:layout_weight="1"android:scrollbars="none" /&gt;&lt;Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="@color/gray3" /&gt;&lt;RelativeLayoutandroid:id="@+id/rl_bottom"android:layout_width="match_parent"android:layout_height="50dp"android:layout_alignParentBottom="true"android:background="@color/white"&gt;&lt;CheckBoxandroid:id="@+id/ck_all"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_centerVertical="true"android:button="@drawable/check_box_style"android:checkMark="?android:attr/listChoiceIndicatorMultiple"android:gravity="center"android:paddingLeft="10dp"android:scaleX="0.6"android:scaleY="0.6"android:text="全选"android:textAppearance="?android:attr/textAppearanceLarge"android:textColor="@color/desccolor" /&gt;&lt;TextViewandroid:id="@+id/tv_settlement"android:layout_width="80dp"android:layout_height="match_parent"android:layout_alignParentRight="true"android:background="@color/desccolor"android:gravity="center"android:text="结算(0)"android:textColor="@color/white" /&gt;&lt;TextViewandroid:id="@+id/tv_show_price"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_toLeftOf="@id/tv_settlement"android:gravity="center"android:padding="5dp"android:text="合计:0.00"android:textColor="@color/desccolor" /&gt;
&lt;/RelativeLayout&gt;

</LinearLayout>再来看 ListView item的布局

item 布局xml

[html] view plaincopyprint?
  1. <?xml version=“1.0” encoding=“utf-8”?>
  2. <RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
  3. android:layout_width=“match_parent”
  4. android:layout_height=“190dp”
  5. android:orientation=“vertical”>
  6. <CheckBox
  7. android:id=“@+id/ck_chose”
  8. android:layout_width=“wrap_content”
  9. android:layout_height=“wrap_content”
  10. android:layout_centerVertical=“true”
  11. android:layout_marginLeft=“8dp”
  12. android:button=“@drawable/check_box_style”
  13. android:scaleX=“0.6”
  14. android:scaleY=“0.6” />
  15. <ImageView
  16. android:id=“@+id/iv_show_pic”
  17. android:layout_width=“wrap_content”
  18. android:layout_height=“wrap_content”
  19. android:layout_centerVertical=“true”
  20. android:layout_marginLeft=“10dp”
  21. android:layout_toRightOf=“@id/ck_chose”
  22. android:background=“@mipmap/demo” />
  23. <LinearLayout
  24. android:layout_width=“wrap_content”
  25. android:layout_height=“wrap_content”
  26. android:layout_marginLeft=“15dp”
  27. android:layout_marginTop=“30dp”
  28. android:layout_toRightOf=“@id/iv_show_pic”
  29. android:orientation=“vertical”>
  30. <TextView
  31. android:id=“@+id/tv_commodity_name”
  32. android:layout_width=“wrap_content”
  33. android:layout_height=“wrap_content”
  34. android:text=“酒红色纯红色纯羊毛西服套装”
  35. android:textColor=“@color/black”
  36. android:textStyle=“bold” />
  37. <RelativeLayout
  38. android:id=“@+id/rl_edit”
  39. android:layout_width=“110dp”
  40. android:layout_height=“30dp”
  41. android:orientation=“horizontal”
  42. android:visibility=“gone”>
  43. <ImageView
  44. android:id=“@+id/iv_sub”
  45. android:layout_width=“wrap_content”
  46. android:layout_height=“wrap_content”
  47. android:background=“@mipmap/iv_sub” />
  48. <TextView
  49. android:id=“@+id/tv_show_num”
  50. android:layout_width=“wrap_content”
  51. android:layout_height=“wrap_content”
  52. android:layout_centerHorizontal=“true”
  53. android:layout_centerVertical=“true”
  54. android:text=“1”
  55. android:textColor=“@color/desccolor” />
  56. <ImageView
  57. android:id=“@+id/iv_add”
  58. android:layout_width=“wrap_content”
  59. android:layout_height=“wrap_content”
  60. android:layout_alignParentRight=“true”
  61. android:background=“@mipmap/iv_add” />
  62. <View
  63. android:layout_width=“match_parent”
  64. android:layout_height=“0.7dp”
  65. android:layout_alignParentBottom=“true”
  66. android:background=“@color/black” />
  67. </RelativeLayout>
  68. <TextView
  69. android:id=“@+id/tv_fabric”
  70. android:layout_width=“wrap_content”
  71. android:layout_height=“wrap_content”
  72. android:layout_marginTop=“10dp”
  73. android:text=“面料:”
  74. android:textColor=“@color/gray5” />
  75. <LinearLayout
  76. android:layout_width=“wrap_content”
  77. android:layout_height=“wrap_content”
  78. android:orientation=“horizontal”>
  79. <TextView
  80. android:id=“@+id/tv_dress”
  81. android:layout_width=“wrap_content”
  82. android:layout_height=“wrap_content”
  83. android:layout_marginTop=“10dp”
  84. android:text=“西服尺寸: 48”
  85. android:textColor=“@color/gray5” />
  86. </LinearLayout>
  87. <TextView
  88. android:id=“@+id/tv_pants”
  89. android:layout_width=“wrap_content”
  90. android:layout_height=“wrap_content”
  91. android:layout_marginTop=“10dp”
  92. android:text=“西裤尺寸: 68”
  93. android:textColor=“@color/gray5” />
  94. <LinearLayout
  95. android:layout_width=“wrap_content”
  96. android:layout_height=“wrap_content”
  97. android:layout_marginTop=“10dp”
  98. android:orientation=“horizontal”>
  99. <TextView
  100. android:id=“@+id/tv_price”
  101. android:layout_width=“wrap_content”
  102. android:layout_height=“wrap_content”
  103. android:text=“¥390”
  104. android:textColor=“@color/black”
  105. android:textStyle=“bold” />
  106. <TextView
  107. android:id=“@+id/tv_num”
  108. android:layout_width=“wrap_content”
  109. android:layout_height=“wrap_content”
  110. android:layout_marginLeft=“40dp”
  111. android:text=“x1”
  112. android:textColor=“@color/gray5” />
  113. </LinearLayout>
  114. </LinearLayout>
  115. <TextView
  116. android:id=“@+id/tv_delete”
  117. android:layout_width=“60dp”
  118. android:layout_height=“match_parent”
  119. android:layout_alignParentRight=“true”
  120. android:background=“@color/address_press”
  121. android:gravity=“center”
  122. android:text=“删除”
  123. android:visibility=“gone” />
  124. </RelativeLayout>
<?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=”190dp” android:orientation=”vertical”>
&lt;CheckBoxandroid:id="@+id/ck_chose"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginLeft="8dp"android:button="@drawable/check_box_style"android:scaleX="0.6"android:scaleY="0.6" /&gt;&lt;ImageViewandroid:id="@+id/iv_show_pic"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginLeft="10dp"android:layout_toRightOf="@id/ck_chose"android:background="@mipmap/demo" /&gt;&lt;LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="15dp"android:layout_marginTop="30dp"android:layout_toRightOf="@id/iv_show_pic"android:orientation="vertical"&gt;&lt;TextViewandroid:id="@+id/tv_commodity_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="酒红色纯红色纯羊毛西服套装"android:textColor="@color/black"android:textStyle="bold" /&gt;&lt;RelativeLayoutandroid:id="@+id/rl_edit"android:layout_width="110dp"android:layout_height="30dp"android:orientation="horizontal"android:visibility="gone"&gt;&lt;ImageViewandroid:id="@+id/iv_sub"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@mipmap/iv_sub" /&gt;&lt;TextViewandroid:id="@+id/tv_show_num"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:text="1"android:textColor="@color/desccolor" /&gt;&lt;ImageViewandroid:id="@+id/iv_add"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:background="@mipmap/iv_add" /&gt;&lt;Viewandroid:layout_width="match_parent"android:layout_height="0.7dp"android:layout_alignParentBottom="true"android:background="@color/black" /&gt;&lt;/RelativeLayout&gt;&lt;TextViewandroid:id="@+id/tv_fabric"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="面料:"android:textColor="@color/gray5" /&gt;&lt;LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"&gt;&lt;TextViewandroid:id="@+id/tv_dress"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="西服尺寸: 48"android:textColor="@color/gray5" /&gt;&lt;/LinearLayout&gt;&lt;TextViewandroid:id="@+id/tv_pants"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="西裤尺寸: 68"android:textColor="@color/gray5" /&gt;&lt;LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:orientation="horizontal"&gt;&lt;TextViewandroid:id="@+id/tv_price"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="¥390"android:textColor="@color/black"android:textStyle="bold" /&gt;&lt;TextViewandroid:id="@+id/tv_num"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="40dp"android:text="x1"android:textColor="@color/gray5" /&gt;&lt;/LinearLayout&gt;
&lt;/LinearLayout&gt;&lt;TextViewandroid:id="@+id/tv_delete"android:layout_width="60dp"android:layout_height="match_parent"android:layout_alignParentRight="true"android:background="@color/address_press"android:gravity="center"android:text="删除"android:visibility="gone" /&gt;

</RelativeLayout>好了 ,,布局就说完了 现在我们来看看逻辑部分

由于很多操作是在Activity中操作 ListView的item ,所以我这里选择的是接口回调,我感觉方便些..也许你会有更好的方法.

首先我们在 Adapter中定义了几个

[java] view plaincopyprint?
  1. /
  2.  复选框接口
  3. /
  4. public interface CheckInterface {
  5. /
  6.  组选框状态改变触发的事件
  7.  @param position  元素位置
  8. @param isChecked 元素选中与否
  9. /
  10. void checkGroup(int position, boolean isChecked);
  11. }
  12. /
  13. 改变数量的接口
  14. /
  15. public interface ModifyCountInterface {
  16. /
  17. 增加操作
  18. @param position      组元素位置
  19.  @param showCountView 用于展示变化后数量的View
  20. @param isChecked     子元素选中与否
  21. /
  22. void doIncrease(int position, View showCountView, boolean isChecked);
  23. /
  24. 删减操作
  25. @param position      组元素位置
  26.  @param showCountView 用于展示变化后数量的View
  27. @param isChecked     子元素选中与否
  28. /
  29. void doDecrease(int position, View showCountView, boolean isChecked);
  30. /
  31. 删除子item
  32. @param position
  33. /
  34. void childDelete(int position);
  35. }
    /* * 复选框接口 */ public interface CheckInterface { /** * 组选框状态改变触发的事件 * * @param position  元素位置 * @param isChecked 元素选中与否 */ void checkGroup(int position, boolean isChecked); }
/*** 改变数量的接口*/
public interface ModifyCountInterface {/*** 增加操作** @param position      组元素位置* @param showCountView 用于展示变化后数量的View* @param isChecked     子元素选中与否*/void doIncrease(int position, View showCountView, boolean isChecked);/*** 删减操作** @param position      组元素位置* @param showCountView 用于展示变化后数量的View* @param isChecked     子元素选中与否*/void doDecrease(int position, View showCountView, boolean isChecked);/*** 删除子item** @param position*/void childDelete(int position);
}</pre>

再来看看Adapter 没啥可说的.. 注释我在代码写的还算详细 ,相信能看懂

[java] view plaincopyprint?
  1. public class ShoppingCartAdapter extends BaseAdapter {
  2. private boolean isShow = true;//是否显示编辑/完成
  3. private List<ShoppingCartBean> shoppingCartBeanList;
  4. private CheckInterface checkInterface;
  5. private ModifyCountInterface modifyCountInterface;
  6. private Context context;
  7. public ShoppingCartAdapter(Context context) {
  8. this.context = context;
  9. }
  10. public void setShoppingCartBeanList(List<ShoppingCartBean> shoppingCartBeanList) {
  11. this.shoppingCartBeanList = shoppingCartBeanList;
  12. notifyDataSetChanged();
  13. }
  14. /
  15.  单选接口
  16.  @param checkInterface
  17. /
  18. public void setCheckInterface(CheckInterface checkInterface) {
  19. this.checkInterface = checkInterface;
  20. }
  21. /
  22.  改变商品数量接口
  23.  @param modifyCountInterface
  24. /
  25. public void setModifyCountInterface(ModifyCountInterface modifyCountInterface) {
  26. this.modifyCountInterface = modifyCountInterface;
  27. }
  28. @Override
  29. public int getCount() {
  30. return shoppingCartBeanList == null ? 0 : shoppingCartBeanList.size();
  31. }
  32. @Override
  33. public Object getItem(int position) {
  34. return shoppingCartBeanList.get(position);
  35. }
  36. @Override
  37. public long getItemId(int position) {
  38. return position;
  39. }
  40. /*
  41. 是否显示可编辑
  42. @param flag
  43. */
  44. public void isShow(boolean flag) {
  45. isShow = flag;
  46. notifyDataSetChanged();
  47. }
  48. @Override
  49. public View getView(final int position, View convertView, ViewGroup parent) {
  50. final ViewHolder holder;
  51. if (convertView == null) {
  52. convertView = LayoutInflater.from(context).inflate(R.layout.item_shopping_cart_layout, parent, false);
  53. holder = new ViewHolder(convertView);
  54. convertView.setTag(holder);
  55. } else {
  56. holder = (ViewHolder) convertView.getTag();
  57. }
  58. final ShoppingCartBean shoppingCartBean = shoppingCartBeanList.get(position);
  59. holder.tv_commodity_name.setText(shoppingCartBean.getShoppingName());
  60. holder.tv_fabric.setText(”面料:” + shoppingCartBean.getFabric());
  61. holder.tv_dress.setText(”西服尺寸:” + shoppingCartBean.getDressSize());
  62. holder.tv_pants.setText(”西裤尺寸:” + shoppingCartBean.getPantsSize());
  63. holder.tv_price.setText(”¥:” + shoppingCartBean.getPrice());
  64. holder.ck_chose.setChecked(shoppingCartBean.isChoosed());
  65. holder.tv_show_num.setText(shoppingCartBean.getCount() + ”“);
  66. holder.tv_num.setText(”X” + shoppingCartBean.getCount());
  67. //单选框按钮
  68. holder.ck_chose.setOnClickListener(
  69. new View.OnClickListener() {
  70. @Override
  71. public void onClick(View v) {
  72. shoppingCartBean.setChoosed(((CheckBox) v).isChecked());
  73. checkInterface.checkGroup(position, ((CheckBox) v).isChecked());//向外暴露接口
  74. }
  75. }
  76. );
  77. //增加按钮
  78. holder.iv_add.setOnClickListener(new View.OnClickListener() {
  79. @Override
  80. public void onClick(View v) {
  81. modifyCountInterface.doIncrease(position, holder.tv_show_num, holder.ck_chose.isChecked());//暴露增加接口
  82. }
  83. });
  84. //删减按钮
  85. holder.iv_sub.setOnClickListener(new View.OnClickListener() {
  86. @Override
  87. public void onClick(View v) {
  88. modifyCountInterface.doDecrease(position, holder.tv_show_num, holder.ck_chose.isChecked());//暴露删减接口
  89. }
  90. });
  91. //删除弹窗
  92. holder.tv_delete.setOnClickListener(new View.OnClickListener() {
  93. @Override
  94. public void onClick(View v) {
  95. AlertDialog alert = new AlertDialog.Builder(context).create();
  96. alert.setTitle(”操作提示”);
  97. alert.setMessage(”您确定要将这些商品从购物车中移除吗?”);
  98. alert.setButton(DialogInterface.BUTTON_NEGATIVE, ”取消”,
  99. new DialogInterface.OnClickListener() {
  100. @Override
  101. public void onClick(DialogInterface dialog, int which) {
  102. return;
  103. }
  104. });
  105. alert.setButton(DialogInterface.BUTTON_POSITIVE, ”确定”,
  106. new DialogInterface.OnClickListener() {
  107. @Override
  108. public void onClick(DialogInterface dialog, int which) {
  109. modifyCountInterface.childDelete(position);//删除 目前只是从item中移除
  110. }
  111. });
  112. alert.show();
  113. }
  114. });
  115. //判断是否在编辑状态下
  116. if (isShow) {
  117. holder.tv_commodity_name.setVisibility(View.VISIBLE);
  118. holder.tv_fabric.setVisibility(View.VISIBLE);
  119. holder.rl_edit.setVisibility(View.GONE);
  120. holder.tv_delete.setVisibility(View.GONE);
  121. } else {
  122. holder.tv_commodity_name.setVisibility(View.GONE);
  123. holder.tv_fabric.setVisibility(View.GONE);
  124. holder.rl_edit.setVisibility(View.VISIBLE);
  125. holder.tv_delete.setVisibility(View.VISIBLE);
  126. }
  127. return convertView;
  128. }
  129. //初始化控件
  130. class ViewHolder {
  131. ImageView iv_chose;
  132. ImageView iv_show_pic, iv_sub, iv_add;
  133. TextView tv_commodity_name, tv_fabric, tv_dress, tv_pants, tv_price, tv_num, tv_delete, tv_show_num;
  134. CheckBox ck_chose;
  135. RelativeLayout rl_edit;
  136. public ViewHolder(View itemView) {
  137. ck_chose = (CheckBox) itemView.findViewById(R.id.ck_chose);
  138. iv_show_pic = (ImageView) itemView.findViewById(R.id.iv_show_pic);
  139. iv_sub = (ImageView) itemView.findViewById(R.id.iv_sub);
  140. iv_add = (ImageView) itemView.findViewById(R.id.iv_add);
  141. tv_commodity_name = (TextView) itemView.findViewById(R.id.tv_commodity_name);
  142. tv_fabric = (TextView) itemView.findViewById(R.id.tv_fabric);
  143. tv_dress = (TextView) itemView.findViewById(R.id.tv_dress);
  144. tv_pants = (TextView) itemView.findViewById(R.id.tv_pants);
  145. tv_price = (TextView) itemView.findViewById(R.id.tv_price);
  146. tv_num = (TextView) itemView.findViewById(R.id.tv_num);
  147. tv_delete = (TextView) itemView.findViewById(R.id.tv_delete);
  148. tv_show_num = (TextView) itemView.findViewById(R.id.tv_show_num);
  149. rl_edit = (RelativeLayout) itemView.findViewById(R.id.rl_edit);
  150. }
  151. }
public class ShoppingCartAdapter extends BaseAdapter {
private boolean isShow = true;//是否显示编辑/完成
private List&lt;ShoppingCartBean&gt; shoppingCartBeanList;
private CheckInterface checkInterface;
private ModifyCountInterface modifyCountInterface;
private Context context;public ShoppingCartAdapter(Context context) {this.context = context;
}public void setShoppingCartBeanList(List&lt;ShoppingCartBean&gt; shoppingCartBeanList) {this.shoppingCartBeanList = shoppingCartBeanList;notifyDataSetChanged();
}/*** 单选接口** @param checkInterface*/
public void setCheckInterface(CheckInterface checkInterface) {this.checkInterface = checkInterface;
}/*** 改变商品数量接口** @param modifyCountInterface*/
public void setModifyCountInterface(ModifyCountInterface modifyCountInterface) {this.modifyCountInterface = modifyCountInterface;
}@Override
public int getCount() {return shoppingCartBeanList == null ? 0 : shoppingCartBeanList.size();
}@Override
public Object getItem(int position) {return shoppingCartBeanList.get(position);
}@Override
public long getItemId(int position) {return position;
}/*** 是否显示可编辑** @param flag*/
public void isShow(boolean flag) {isShow = flag;notifyDataSetChanged();
}@Override
public View getView(final int position, View convertView, ViewGroup parent) {final ViewHolder holder;if (convertView == null) {convertView = LayoutInflater.from(context).inflate(R.layout.item_shopping_cart_layout, parent, false);holder = new ViewHolder(convertView);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}final ShoppingCartBean shoppingCartBean = shoppingCartBeanList.get(position);holder.tv_commodity_name.setText(shoppingCartBean.getShoppingName());holder.tv_fabric.setText("面料:" + shoppingCartBean.getFabric());holder.tv_dress.setText("西服尺寸:" + shoppingCartBean.getDressSize());holder.tv_pants.setText("西裤尺寸:" + shoppingCartBean.getPantsSize());holder.tv_price.setText("¥:" + shoppingCartBean.getPrice());holder.ck_chose.setChecked(shoppingCartBean.isChoosed());holder.tv_show_num.setText(shoppingCartBean.getCount() + "");holder.tv_num.setText("X" + shoppingCartBean.getCount());//单选框按钮holder.ck_chose.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {shoppingCartBean.setChoosed(((CheckBox) v).isChecked());checkInterface.checkGroup(position, ((CheckBox) v).isChecked());//向外暴露接口}});//增加按钮holder.iv_add.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {modifyCountInterface.doIncrease(position, holder.tv_show_num, holder.ck_chose.isChecked());//暴露增加接口}});//删减按钮holder.iv_sub.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {modifyCountInterface.doDecrease(position, holder.tv_show_num, holder.ck_chose.isChecked());//暴露删减接口}});//删除弹窗holder.tv_delete.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {AlertDialog alert = new AlertDialog.Builder(context).create();alert.setTitle("操作提示");alert.setMessage("您确定要将这些商品从购物车中移除吗?");alert.setButton(DialogInterface.BUTTON_NEGATIVE, "取消",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {return;}});alert.setButton(DialogInterface.BUTTON_POSITIVE, "确定",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {modifyCountInterface.childDelete(position);//删除 目前只是从item中移除}});alert.show();}});//判断是否在编辑状态下if (isShow) {holder.tv_commodity_name.setVisibility(View.VISIBLE);holder.tv_fabric.setVisibility(View.VISIBLE);holder.rl_edit.setVisibility(View.GONE);holder.tv_delete.setVisibility(View.GONE);} else {holder.tv_commodity_name.setVisibility(View.GONE);holder.tv_fabric.setVisibility(View.GONE);holder.rl_edit.setVisibility(View.VISIBLE);holder.tv_delete.setVisibility(View.VISIBLE);}return convertView;
}//初始化控件
class ViewHolder {ImageView iv_chose;ImageView iv_show_pic, iv_sub, iv_add;TextView tv_commodity_name, tv_fabric, tv_dress, tv_pants, tv_price, tv_num, tv_delete, tv_show_num;CheckBox ck_chose;RelativeLayout rl_edit;public ViewHolder(View itemView) {ck_chose = (CheckBox) itemView.findViewById(R.id.ck_chose);iv_show_pic = (ImageView) itemView.findViewById(R.id.iv_show_pic);iv_sub = (ImageView) itemView.findViewById(R.id.iv_sub);iv_add = (ImageView) itemView.findViewById(R.id.iv_add);tv_commodity_name = (TextView) itemView.findViewById(R.id.tv_commodity_name);tv_fabric = (TextView) itemView.findViewById(R.id.tv_fabric);tv_dress = (TextView) itemView.findViewById(R.id.tv_dress);tv_pants = (TextView) itemView.findViewById(R.id.tv_pants);tv_price = (TextView) itemView.findViewById(R.id.tv_price);tv_num = (TextView) itemView.findViewById(R.id.tv_num);tv_delete = (TextView) itemView.findViewById(R.id.tv_delete);tv_show_num = (TextView) itemView.findViewById(R.id.tv_show_num);rl_edit = (RelativeLayout) itemView.findViewById(R.id.rl_edit);}}

现在我们在来看看Activity 代码, 同样注释写的很详细

[java] view plaincopyprint?
  1. public class ShoppingCartActivity extends BaseActivity implements View.OnClickListener
  2. , ShoppingCartAdapter.CheckInterface, ShoppingCartAdapter.ModifyCountInterface {
  3. public TextView tv_title, tv_settlement, tv_show_price;
  4. private TextView tv_all_check;
  5. private CheckBox ck_all;
  6. private ListView list_shopping_cart;
  7. private ShoppingCartAdapter shoppingCartAdapter;
  8. private TextView tv_edit;
  9. private boolean flag = false;
  10. private List<ShoppingCartBean> shoppingCartBeanList = new ArrayList<>();
  11. private boolean mSelect;
  12. private double totalPrice = 0.00;// 购买的商品总价
  13. private int totalCount = 0;// 购买的商品总数量
  14. /
  15.  批量模式下,用来记录当前选中状态
  16. /
  17. private SparseArray<Boolean> mSelectState = new SparseArray<Boolean>();
  18. @Override
  19. protected int getLayout() {
  20. return R.layout.layout_shopping_cart_activity;
  21. }
  22. @Override
  23. protected void initView() {
  24. tv_title = bindView(R.id.tv_title);
  25. tv_title.setText(”购物车”);
  26. list_shopping_cart = bindView(R.id.list_shopping_cart);
  27. //        list_shopping_cart.setOnItemClickListener(this);
  28. ck_all = bindView(R.id.ck_all);
  29. ck_all.setOnClickListener(this);
  30. //        ck_all.setOnCheckedChangeListener(this);
  31. tv_show_price = bindView(R.id.tv_show_price);
  32. tv_settlement = bindView(R.id.tv_settlement);
  33. tv_settlement.setOnClickListener(this);
  34. tv_edit = bindView(R.id.tv_edit);
  35. tv_edit.setOnClickListener(this);
  36. shoppingCartAdapter = new ShoppingCartAdapter(this);
  37. shoppingCartAdapter.setCheckInterface(this);
  38. shoppingCartAdapter.setModifyCountInterface(this);
  39. list_shopping_cart.setAdapter(shoppingCartAdapter);
  40. shoppingCartAdapter.setShoppingCartBeanList(shoppingCartBeanList);
  41. }
  42. @Override
  43. protected void initData() {
  44. for (int i = 0; i < 6; i++) {
  45. ShoppingCartBean shoppingCartBean = new ShoppingCartBean();
  46. shoppingCartBean.setShoppingName(”高端大气上档次的T桖”);
  47. shoppingCartBean.setFabric(”纯棉”);
  48. shoppingCartBean.setDressSize(48);
  49. shoppingCartBean.setPantsSize(65);
  50. shoppingCartBean.setPrice(60);
  51. shoppingCartBean.setCount(2);
  52. shoppingCartBeanList.add(shoppingCartBean);
  53. }
  54. }
  55. @Override
  56. public void onClick(View v) {
  57. switch (v.getId()) {
  58. //全选按钮
  59. case R.id.ck_all:
  60. if (shoppingCartBeanList.size() != 0) {
  61. if (ck_all.isChecked()) {
  62. for (int i = 0; i < shoppingCartBeanList.size(); i++) {
  63. shoppingCartBeanList.get(i).setChoosed(true);
  64. }
  65. shoppingCartAdapter.notifyDataSetChanged();
  66. } else {
  67. for (int i = 0; i < shoppingCartBeanList.size(); i++) {
  68. shoppingCartBeanList.get(i).setChoosed(false);
  69. }
  70. shoppingCartAdapter.notifyDataSetChanged();
  71. }
  72. }
  73. statistics();
  74. break;
  75. case R.id.tv_edit:
  76. flag = !flag;
  77. if (flag) {
  78. tv_edit.setText(”完成”);
  79. shoppingCartAdapter.isShow(false);
  80. } else {
  81. tv_edit.setText(”编辑”);
  82. shoppingCartAdapter.isShow(true);
  83. }
  84. break;
  85. }
  86. }
  87. /
  88.  单选
  89.  @param position  组元素位置
  90. @param isChecked 组元素选中与否
  91. /
  92. @Override
  93. public void checkGroup(int position, boolean isChecked) {
  94. shoppingCartBeanList.get(position).setChoosed(isChecked);
  95. if (isAllCheck())
  96. ck_all.setChecked(true);
  97. else
  98. ck_all.setChecked(false);
  99. shoppingCartAdapter.notifyDataSetChanged();
  100. statistics();
  101. }
  102. /
  103. 遍历list集合
  104. @return
  105. /
  106. private boolean isAllCheck() {
  107. for (ShoppingCartBean group : shoppingCartBeanList) {
  108. if (!group.isChoosed())
  109. return false;
  110. }
  111. return true;
  112. }
  113. /
  114. 统计操作
  115.  1.先清空全局计数器<br>
  116. 2.遍历所有子元素,只要是被选中状态的,就进行相关的计算操作
  117.  3.给底部的textView进行数据填充
  118. /
  119. public void statistics() {
  120. totalCount = 0;
  121. totalPrice = 0.00;
  122. for (int i = 0; i < shoppingCartBeanList.size(); i++) {
  123. ShoppingCartBean shoppingCartBean = shoppingCartBeanList.get(i);
  124. if (shoppingCartBean.isChoosed()) {
  125. totalCount++;
  126. totalPrice += shoppingCartBean.getPrice()  shoppingCartBean.getCount();  
  127. }
  128. }
  129. tv_show_price.setText(”合计:” + totalPrice);
  130. tv_settlement.setText(”结算(“ + totalCount + “)”);
  131. }
  132. /
  133. 增加
  134. @param position      组元素位置
  135.  @param showCountView 用于展示变化后数量的View
  136. @param isChecked     子元素选中与否
  137. /
  138. @Override
  139. public void doIncrease(int position, View showCountView, boolean isChecked) {
  140. ShoppingCartBean shoppingCartBean = shoppingCartBeanList.get(position);
  141. int currentCount = shoppingCartBean.getCount();
  142. currentCount++;
  143. shoppingCartBean.setCount(currentCount);
  144. ((TextView) showCountView).setText(currentCount + ”“);
  145. shoppingCartAdapter.notifyDataSetChanged();
  146. statistics();
  147. }
  148. /
  149. 删减
  150. @param position      组元素位置
  151.  @param showCountView 用于展示变化后数量的View
  152. @param isChecked     子元素选中与否
  153. /
  154. @Override
  155. public void doDecrease(int position, View showCountView, boolean isChecked) {
  156. ShoppingCartBean shoppingCartBean = shoppingCartBeanList.get(position);
  157. int currentCount = shoppingCartBean.getCount();
  158. if (currentCount == 1) {
  159. return;
  160. }
  161. currentCount–;
  162. shoppingCartBean.setCount(currentCount);
  163. ((TextView) showCountView).setText(currentCount + ”“);
  164. shoppingCartAdapter.notifyDataSetChanged();
  165. statistics();
  166. }
  167. /*
  168.  删除
  169.  @param position
  170. /
  171. @Override
  172. public void childDelete(int position) {
  173. shoppingCartBeanList.remove(position);
  174. shoppingCartAdapter.notifyDataSetChanged();
  175. statistics();
  176. }
  177. }
public class ShoppingCartActivity extends BaseActivity implements View.OnClickListener , ShoppingCartAdapter.CheckInterface, ShoppingCartAdapter.ModifyCountInterface { public TextView tv_title, tv_settlement, tv_show_price; private TextView tv_all_check; private CheckBox ck_all; private ListView list_shopping_cart; private ShoppingCartAdapter shoppingCartAdapter; private TextView tv_edit; private boolean flag = false; private List<ShoppingCartBean> shoppingCartBeanList = new ArrayList<>(); private boolean mSelect; private double totalPrice = 0.00;// 购买的商品总价 private int totalCount = 0;// 购买的商品总数量 /** * 批量模式下,用来记录当前选中状态 */ private SparseArray<Boolean> mSelectState = new SparseArray<Boolean>();
@Override
protected int getLayout() {return R.layout.layout_shopping_cart_activity;
}@Override
protected void initView() {tv_title = bindView(R.id.tv_title);tv_title.setText("购物车");list_shopping_cart = bindView(R.id.list_shopping_cart);

// list_shopping_cart.setOnItemClickListener(this);
ck_all = bindView(R.id.ck_all);
ck_all.setOnClickListener(this);
// ck_all.setOnCheckedChangeListener(this);
tv_show_price = bindView(R.id.tv_show_price);
tv_settlement = bindView(R.id.tv_settlement);
tv_settlement.setOnClickListener(this);
tv_edit = bindView(R.id.tv_edit);
tv_edit.setOnClickListener(this);
shoppingCartAdapter = new ShoppingCartAdapter(this);
shoppingCartAdapter.setCheckInterface(this);
shoppingCartAdapter.setModifyCountInterface(this);
list_shopping_cart.setAdapter(shoppingCartAdapter);
shoppingCartAdapter.setShoppingCartBeanList(shoppingCartBeanList);

}@Override
protected void initData() {for (int i = 0; i &lt; 6; i++) {ShoppingCartBean shoppingCartBean = new ShoppingCartBean();shoppingCartBean.setShoppingName("高端大气上档次的T桖");shoppingCartBean.setFabric("纯棉");shoppingCartBean.setDressSize(48);shoppingCartBean.setPantsSize(65);shoppingCartBean.setPrice(60);shoppingCartBean.setCount(2);shoppingCartBeanList.add(shoppingCartBean);}}@Override
public void onClick(View v) {switch (v.getId()) {//全选按钮  case R.id.ck_all:if (shoppingCartBeanList.size() != 0) {if (ck_all.isChecked()) {for (int i = 0; i &lt; shoppingCartBeanList.size(); i++) {shoppingCartBeanList.get(i).setChoosed(true);}shoppingCartAdapter.notifyDataSetChanged();} else {for (int i = 0; i &lt; shoppingCartBeanList.size(); i++) {shoppingCartBeanList.get(i).setChoosed(false);}shoppingCartAdapter.notifyDataSetChanged();}}statistics();break;case R.id.tv_edit:flag = !flag;if (flag) {tv_edit.setText("完成");shoppingCartAdapter.isShow(false);} else {tv_edit.setText("编辑");shoppingCartAdapter.isShow(true);}break;}
}/*** 单选** @param position  组元素位置* @param isChecked 组元素选中与否*/
@Override
public void checkGroup(int position, boolean isChecked) {shoppingCartBeanList.get(position).setChoosed(isChecked);if (isAllCheck())ck_all.setChecked(true);elseck_all.setChecked(false);shoppingCartAdapter.notifyDataSetChanged();statistics();
}/*** 遍历list集合** @return*/
private boolean isAllCheck() {for (ShoppingCartBean group : shoppingCartBeanList) {if (!group.isChoosed())return false;}return true;
}/*** 统计操作* 1.先清空全局计数器&lt;br&gt;* 2.遍历所有子元素,只要是被选中状态的,就进行相关的计算操作* 3.给底部的textView进行数据填充*/
public void statistics() {totalCount = 0;totalPrice = 0.00;for (int i = 0; i &lt; shoppingCartBeanList.size(); i++) {ShoppingCartBean shoppingCartBean = shoppingCartBeanList.get(i);if (shoppingCartBean.isChoosed()) {totalCount++;totalPrice += shoppingCartBean.getPrice() * shoppingCartBean.getCount();}}tv_show_price.setText("合计:" + totalPrice);tv_settlement.setText("结算(" + totalCount + ")");
}/*** 增加** @param position      组元素位置* @param showCountView 用于展示变化后数量的View* @param isChecked     子元素选中与否*/
@Override
public void doIncrease(int position, View showCountView, boolean isChecked) {ShoppingCartBean shoppingCartBean = shoppingCartBeanList.get(position);int currentCount = shoppingCartBean.getCount();currentCount++;shoppingCartBean.setCount(currentCount);((TextView) showCountView).setText(currentCount + "");shoppingCartAdapter.notifyDataSetChanged();statistics();
}/*** 删减** @param position      组元素位置* @param showCountView 用于展示变化后数量的View* @param isChecked     子元素选中与否*/
@Override
public void doDecrease(int position, View showCountView, boolean isChecked) {ShoppingCartBean shoppingCartBean = shoppingCartBeanList.get(position);int currentCount = shoppingCartBean.getCount();if (currentCount == 1) {return;}currentCount--;shoppingCartBean.setCount(currentCount);((TextView) showCountView).setText(currentCount + "");shoppingCartAdapter.notifyDataSetChanged();statistics();}/*** 删除** @param position*/
@Override
public void childDelete(int position) {shoppingCartBeanList.remove(position);shoppingCartAdapter.notifyDataSetChanged();statistics();}

}
整体的就是这样,,我说一下 我做的时候遇到的问题和解决办法

1.

问题:当我单选一个一个选中后,全选按钮也会自动选中 ,但是当我取消一个item后 全选按钮没有自动取消 (正常是只有有一个item没有选中 全选按钮是不会选中的)

解决:首先解决问题要找到原因所在 ,造成这个Bug的原因是我CheckBox的点击事件用的是setOnCheckedChangeListener 后来换成了setOnClickListener 就好了 .

两者都能实现对CheckBox的状态改变的监听,但一般情况下,用的更多的是setOnCheckedChangeListener。因为,当CheckBox的状态不是通过点击事件改变,而是通过其他的方式改变时,比如setCheck(),setOnClickListener无法完成此种情况下的监听。OnCheckChangedListener监听CheckBox的状态,无论来自你的onClick事件还是其他。

2.

问题: 就是在改变物品个数的是时候会出现复用!

解决: 原因就是我没有保存当前 改变后是值, 保存一下就OK了..

总体上就是这些了…….感兴趣的同学可以下载demo看看

Demo在这里—–>http://download.csdn.net/detail/u011011744/9706870

Android 购物车UI及逻辑实现相关推荐

  1. android 购物车操作并发,Android 购物车页面和逻辑实现

    之前在CSDN上写了几篇..现在想在简书上也写写,所以就过来试试....嘻嘻嘻~~~好,,进入正题.... 这是之前在做的项目中的一个功能 购物车! 我这个购物车业务逻辑还算可以吧,不算太难,但由于我 ...

  2. 转载-Android 前沿UI

    原文地址:https://blog.csdn.net/qq_35224776/article/details/86064712 抽屉菜单 MaterialDrawer ★7337 - 安卓抽屉效果实现 ...

  3. Android 前沿UI

    抽屉菜单 MaterialDrawer ★7337 - 安卓抽屉效果实现方案 Side-Menu.Android ★3865 - 创意边侧菜单 FlowingDrawer ★1744 - 向右滑动流动 ...

  4. ​第一本 Compose 图书上市,联想大咖教你学会 Android 全新 UI 编程

    朱江 | 现任联想(北京)有限公司 Android 开发工程师,从事 Android 开发工作多年,有丰富的项目经验,负责和参与开发过多款移动应用程序,同时还是多个开源项目的作者.2017 年开始在 ...

  5. android的ui怎么做到流畅,android提高UI的流畅度

    android提高UI的流畅度 Android中所有的界面绘制工作都是在UI线程中进行的,提高UI流畅度的最核心根本在于释放UI线程.即:不在主线程中做耗时的操作. 很多人都知道,耗时的操作要放到子线 ...

  6. MTK 驱动(66)---Android recovery UI实现分析

    Android recovery UI实现分析 Android recovery模式为何物? 关于这个问题, baidu上已经有无数的答案,不理解的朋友先补习一下.从纯技术角度来讲, recovery ...

  7. Android 高级UI解密 (三) :Canvas裁剪 与 二维、三维Camera几何变换(图层Layer原理)

    Android的绘图机制是核心内容之一,无论是什么样的功能最终都是以图像的形式呈现给用户.因此掌握Android的绘图技巧,有助于Android理解层次的提高,在面对产品经理提出的idea时也更有底气 ...

  8. Android高级UI系列教程(二)

    上期回顾 Android高级UI系列教程(一)_我想月薪过万的博客-CSDN博客https://blog.csdn.net/qq_41885673/article/details/121870917 ...

  9. 你连《Android高级UI与FrameWork源码》都搞不懂学什么Android?还敢面试阿里P7!

    Android高级UI与FrameWork源码 重要性? 这块知识是现今使用者最多的,我们称之为Android2013~2016年的技术,但是,即使是这样的技术,Android开发者也往往因为网上Co ...

最新文章

  1. [android] 切换按钮-自定义控件
  2. vs2017运行yolov4_windows10+vs2017+opencv3.4.1配置YOLOV4
  3. 大数据分析处理框架——离线分析(hive,pig,spark)、近似实时分析(Impala)和实时分析(storm、spark streaming)...
  4. MYSQL:1045Access denied for user 'root'@'localhost
  5. django-全文检索
  6. FIELD-SYMBOLS详解
  7. Mac下的Mysql无法登陆的问题
  8. L1-042. 日期格式化
  9. git第一次提交代码至远程仓库-强制推送
  10. Python(5):循环
  11. 没有垃圾回收的JVM
  12. 关于 Oracle 存储双活配置和实战
  13. 记录通用权限管理系统组件使用心得体会,写技术博客赢IPad2
  14. LeetCode 222. 完全二叉树的节点个数(递归)
  15. 自动驾驶 2-1 第 1 课补充阅读:传感器和计算硬件 -- 下
  16. LNK2005 解决方法以及发生原因
  17. 《Objective-C 程序设计(第4版)》图书信息
  18. project telecom / dianxin / shenfenzheng / SIM
  19. 猫咪视频_猫视频如何进入您的手机
  20. 克里金插值详细步骤_openlayers4 入门开发系列之前端动态渲染克里金插值 kriging 篇(附源码下载)...

热门文章

  1. 电路原理入门书籍推荐
  2. JS常用的输出内容的方式详解(5种输出方式)
  3. 主机ip6容器ip6以及应用ip6
  4. vue provide / inject 实现组件数据的实时响应
  5. XV6 RISCV 源码阅读之文件系统
  6. springdata数据源的配置
  7. 用好【shareinstall】 App推广转化率提升80% so easy!
  8. Xcode安装特定版本系统的模拟器(不支持断点下载所以总是下载失败)
  9. checkra1n越狱错误79_苹果越狱工具checkra1n获0.10.1 beta更新:支持iOS 13.4.1
  10. 机器学习可视化技术(Towards Data Science)