Android实现购物车功能
作者:jackeysun6032 时间:2022-08-14 19:06:55
最近看了一些淘宝购物车的demo,于是也写了一个。
效果图如下:
主要代码如下:
actvity中的代码:
public class ShoppingCartActivity extends BaseActivity {
private List<Test> data;
private ListView mListView;
private ShoppingCartAdapter adapter;
private RelativeLayout rlRefresh;
private TextView tvRefresh;
private ProgressBar barRefresh;
private LinearLayout clear;
private CheckBox checkBox_select_all;
private CheckBox checkBox_add;
private TextView integral_sum;
private int sum = 0;
private int[] sumIntegral;
private Context context;
@Override
protected void onCreate(Bundle bundle) {
// TODO Auto-generated method stub
super.onCreate(bundle);
setContentView(R.layout.activity_shopping_cart);
initView();
}
private void initView() {
context = this;
showpage = 1;
isPermitFlag = true;
data = new ArrayList<Test>();
// 测试数据
data.add(new Test("id", "color", "type", "100"));
data.add(new Test("id", "color", "type", "200"));
data.add(new Test("id", "color", "type", "300"));
data.add(new Test("id", "color", "type", "0"));
data.add(new Test("id", "color", "type", "300"));
data.add(new Test("id", "color", "type", "100"));
data.add(new Test("id", "color", "type", "500"));
data.add(new Test("id", "color", "type", "0"));
data.add(new Test("id", "color", "type", "900"));
adapter = new ShoppingCartAdapter(context, handler, data);
sumIntegral = new int[data.size() + 1];
checkBox_add = (CheckBox) findViewById(R.id.checkbox_add);
integral_sum = (TextView) findViewById(R.id.integral_sum);
clear = (LinearLayout) findViewById(R.id.clear);
clear.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
data.clear();
adapter.notifyDataSetChanged();
integral_sum.setText(0 + "");
checkBox_select_all.setChecked(false);
checkBox_add.setClickable(false);
}
});
checkBox_select_all = (CheckBox) findViewById(R.id.checkbox_select);
checkBox_select_all.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
HashMap<Integer, Boolean> isSelected = ShoppingCartAdapter
.getIsSelected();
Iterator iterator = isSelected.entrySet().iterator();
List<Boolean> array = new ArrayList<Boolean>();//列表中checkbox选中状态
List<Integer> nums = new ArrayList<Integer>();//列表中商品数量
while (iterator.hasNext()) {
HashMap.Entry entry = (HashMap.Entry) iterator.next();
Integer key = (Integer) entry.getKey();
Boolean val = (Boolean) entry.getValue();
array.add(val);
}
for (int i = 0; i < data.size(); i++) {
int num = data.get(i).getNum();
int integral = Integer.valueOf(data.get(i).getIntegral());
nums.add(num);
}
if (checkBox_select_all.isChecked()) {
for (int i = 0; i < data.size(); i++) {
ShoppingCartAdapter.getIsSelected().put(i, true);
}
checkBox_add.setChecked(true);
adapter.notifyDataSetChanged();
} else {
for (int i = 0; i < data.size(); i++) {
ShoppingCartAdapter.getIsSelected().put(i, false);
}
checkBox_add.setChecked(false);
adapter.notifyDataSetChanged();
integral_sum.setText(0 + "");
}
}
});
mListView= (ListView) findViewById(R.id.finance_list);
mListView.setAdapter(adapter);
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(context, position + "", Toast.LENGTH_LONG)
.show();
int pos = position - 1;
ViewHolder viewHolder = (ViewHolder) view.getTag();
int num = data.get(pos).getNum();
if (num == 0) {
Toast.makeText(context, "请选择商品数量", Toast.LENGTH_LONG)
.show();
} else {
boolean cu = !ShoppingCartAdapter.getIsSelected().get(pos);
ShoppingCartAdapter.getIsSelected().put(pos, cu);
adapter.notifyDataSetChanged();
//遍历获取列表中checkbox的选中状态
HashMap<Integer, Boolean> isSelected = ShoppingCartAdapter
.getIsSelected();
Iterator iterator = isSelected.entrySet().iterator();
List<Boolean> array = new ArrayList<Boolean>();
while (iterator.hasNext()) {
HashMap.Entry entry = (HashMap.Entry) iterator.next();
Integer key = (Integer) entry.getKey();
Boolean val = (Boolean) entry.getValue();
array.add(val);
}
if (Test.isAllFalse(array)) {
checkBox_select_all.setChecked(false);
checkBox_add.setChecked(false);
}
if (Test.isAllTrue(array)) {
checkBox_select_all.setChecked(true);
checkBox_add.setChecked(true);
}
if (Test.isHaveOneFasle(array)) {
checkBox_select_all.setChecked(false);
}
if (Test.isHaveOneTrue(array)) {
checkBox_add.setChecked(true);
}
}
}
});
}
@SuppressLint("HandlerLeak")
private Handler handler = new Handler(){
@SuppressWarnings("unchecked")
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what == 10){ //更改选中商品的总价格
float price = (Float)msg.obj;
if(price > 0){
integral_sum.setText(price+"");
}else{
integral_sum.setText("0");
}
}
else if(msg.what == 11){
//列表选中状态
List<Boolean> array = (List<Boolean>) msg.obj;
if (Test.isAllFalse(array)) {
checkBox_select_all.setChecked(false);
checkBox_add.setChecked(false);
}
if (.isAllTrue(array)) {
checkBox_select_all.setChecked(true);
checkBox_add.setChecked(true);
}
if (Test.isHaveOneFasle(array)) {
checkBox_select_all.setChecked(false);
}
if (Test.isHaveOneTrue(array)) {
checkBox_add.setChecked(true);
}
}
}
};
actvity中XML的代码:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:header=http://schemas.android.com/apk/res/com.sxc.test"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/app_background"
android:orientation="vertical" >
<com.autoserve.core.widget.HeaderWidget
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
header:text="我的购物车" />
<LinearLayout
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_below="@id/header"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:background="@color/white"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_weight="1"
android:gravity="center_vertical"
android:orientation="horizontal" >
<CheckBox
android:id="@+id/checkbox_select"
style="@style/CustomCheckboxTheme"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="全选"
android:textColor="@color/gry_666666"
android:textSize="@dimen/small_size" />
</LinearLayout>
<LinearLayout
android:id="@+id/clear"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginRight="20dp"
android:gravity="center_vertical|right"
android:orientation="horizontal" >
<CheckBox
android:layout_width="12dp"
android:layout_height="12dp"
android:background="@drawable/clear" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="清空购物车"
android:textColor="#b61d1d"
android:textSize="@dimen/small_size" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/layout1"
android:layout_marginBottom="50dp"
android:orientation="vertical" >
<View
android:layout_width="match_parent"
android:layout_height="0.1dp"
android:background="@color/divider_color" />
<ListView
android:id="@+id/finance_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="false"
android:divider="@color/lucency" />
<include
layout="@layout/include_refresh"
android:visibility="gone" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:background="@color/gry_999999"
android:gravity="center_vertical"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:gravity="center"
android:orientation="horizontal" >
<CheckBox
android:id="@+id/checkbox_add"
style="@style/CustomCheckboxTheme2"
android:layout_width="wrap_content"
android:clickable="false"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="合计:"
android:textColor="@color/white"
android:textSize="@dimen/small_size" />
<TextView
android:id="@+id/integral_sum"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:text="0"
android:textColor="@color/theme_color"
android:textSize="@dimen/small_size" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="积分"
android:textColor="@color/white"
android:textSize="@dimen/small_size" />
</LinearLayout>
</LinearLayout>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@color/theme_color"
android:gravity="center"
android:text="结算"
android:textColor="@color/white"
android:textSize="@dimen/small_size" />
</LinearLayout>
</RelativeLayout>
-XML中头部可以到网上找一个这里就不放上来了
.checkbox和button的样式可以根据个人喜好设置。
Adaper中的代码:
public class ShoppingCartAdapter extends BaseAdapter {
private Context context;
private List<Test> loans;
private LayoutInflater inflater;
private static HashMap<Integer, Boolean> isSelected;
private static HashMap<Integer, Integer> numbers;
private Handler handler;
int num;// 商品数量
static class ViewHolder { // 自定义控件集合
public CheckBox ck_select;
public ImageView pic_goods;
public TextView id_goods;
public TextView color_goods;
public TextView type_goods;
public TextView integral_goods;
public AddMinusWidget add_minus;
public LinearLayout layout;
public TextView number;
public Button minus;
public Button plus;
}
/**
* 实例化Adapter
*
* @param context
* @param data
*/
public ShoppingCartAdapter(Context context, Handler handler, List<Test> data) {
this.context = context;
this.inflater = LayoutInflater.from(context);
this.loans = data;
this.handler = handler;
isSelected = new HashMap<Integer, Boolean>();
numbers = new HashMap<Integer, Integer>();
initDate();
}
private void initDate() {
for (int i = 0; i < loans.size(); i++) {
getIsSelected().put(i, false);
getNumbers().put(i, 1);
}
}
@Override
public int getCount() {
return loans.size();
}
@Override
public Object getItem(int position) {
return loans.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// 自定义视图
ViewHolder itemView = null;
if (convertView == null) {
// 获取list_item布局文件的视图
itemView = new ViewHolder();
convertView = inflater.inflate(R.layout.list_shopping_cart_item,
null);
// 获取控件对象
itemView.ck_select = (CheckBox) convertView
.findViewById(R.id.ck_select);
itemView.pic_goods = (ImageView) convertView
.findViewById(R.id.pic_goods);
itemView.id_goods = (TextView) convertView
.findViewById(R.id.id_goods);
itemView.color_goods = (TextView) convertView
.findViewById(R.id.color_goods);
itemView.type_goods = (TextView) convertView
.findViewById(R.id.type_goods);
itemView.integral_goods = (TextView) convertView
.findViewById(R.id.integral_goods);
itemView.number = (TextView) convertView.findViewById(R.id.number);
itemView.minus = (Button) convertView.findViewById(R.id.minus);
itemView.plus = (Button) convertView.findViewById(R.id.plus);
convertView.setTag(itemView);
} else {
itemView = (ViewHolder) convertView.getTag();
}
init(itemView, position);
itemView.ck_select.setChecked(getIsSelected().get(position));
itemView.number.setText(getNumbers().get(position).toString());
if (getIsSelected().get(position)) {
itemView.ck_select.setChecked(true);
} else {
itemView.ck_select.setChecked(false);
}
String a = itemView.number.getText().toString();
loans.get(position).setNum(Integer.valueOf(a));
Test test = loans.get(position);
itemView.id_goods.setText((CharSequence) test.getId());
itemView.color_goods.setText((CharSequence) test.getColor());
itemView.type_goods.setText((CharSequence) test.getType());
itemView.integral_goods.setText((CharSequence) test.getIntegral());
itemView.pic_goods.setImageResource(R.drawable.shopping);
return convertView;
}
private void init(final ViewHolder itemView, final int position) {
itemView.ck_select
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
isSelected.put(position, true);
getIsSelected().put(position, isChecked);
itemView.ck_select.setChecked(getIsSelected().get(
position));
handler.sendMessage(handler.obtainMessage(10,
getTotalPrice()));
Iterator iterator = isSelected.entrySet().iterator();
List<Boolean> array = new ArrayList<Boolean>();
while (iterator.hasNext()) {
HashMap.Entry entry = (HashMap.Entry) iterator
.next();
Integer key = (Integer) entry.getKey();
Boolean val = (Boolean) entry.getValue();
array.add(val);
}
handler.sendMessage(handler.obtainMessage(11, array));
}
});
final String numString = itemView.number.getText().toString();
itemView.plus.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (numString == null || numString.equals("")) {
num = 1;
itemView.number.setText("1");
} else {
if (++num < 1) // 先加,再判断
{
num--;
Toast.makeText(context, "请输入一个大于0的数字",
Toast.LENGTH_SHORT).show();
} else {
itemView.number.setText(String.valueOf(num));
loans.get(position).setNum(num);
numbers.put(position, num);
handler.sendMessage(handler.obtainMessage(10,
getTotalPrice()));
Log.i("test", "+:" + num);
}
}
}
});
itemView.minus.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (numString == null || numString.equals("")) {
num = 1;
itemView.number.setText("1");
} else {
if (--num < 1) // 先加,再判断
{
num++;
Log.i("test", "-:" + num);
Toast.makeText(context, "请输入一个大于0的数字",
Toast.LENGTH_SHORT).show();
Log.i("test", "-:" + num);
} else {
itemView.number.setText(String.valueOf(num));
Log.i("test", "-:" + num);
loans.get(position).setNum(num);
numbers.put(position, num);
handler.sendMessage(handler.obtainMessage(10,
getTotalPrice()));
}
}
}
});
}
/**
* 计算选中商品的积分
*
* @return 返回需要付费的总积分
*/
private float getTotalPrice() {
Test bean = null;
float totalPrice = 0;
for (int i = 0; i < loans.size(); i++) {
bean = loans.get(i);
if (ShoppingCartAdapter.getIsSelected().get(i)) {
totalPrice += bean.getNum()
* Integer.valueOf(bean.getIntegral());
}
}
return totalPrice;
}
public static HashMap<Integer, Boolean> getIsSelected() {
return isSelected;
}
public static void setIsSelected(HashMap<Integer, Boolean> isSelected) {
ShoppingCartAdapter.isSelected = isSelected;
}
public static HashMap<Integer, Integer> getNumbers() {
return numbers;
}
public static void setNumbers(HashMap<Integer, Integer> numbers) {
ShoppingCartAdapter.numbers = numbers;
}
}
Adapter中的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:descendantFocusability="blocksDescendants"
android:background="@color/white"
android:orientation="vertical" >
<View
android:layout_width="match_parent"
android:layout_height="0.1dp"
android:background="@color/divider_color" />
<LinearLayout
android:id="@+id/layout5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="5dp" >
<CheckBox
android:id="@+id/ck_select"
style="@style/CustomCheckboxTheme"
android:layout_width="wrap_content"
android:focusable="false"
android:layout_height="wrap_content"
android:layout_marginRight="5dp" />
<ImageView
android:id="@+id/pic_goods"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="fitCenter"
android:src="@drawable/shopping" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:orientation="vertical" >
<TextView
android:id="@+id/id_goods"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="短袜男士星期 POLO棉袜潮男秋冬款礼盒装"
android:textColor="@color/gry_999999"
android:textSize="@dimen/small_size" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="颜色:"
android:textColor="@color/gry_999999"
android:textSize="12sp" />
<TextView
android:id="@+id/color_goods"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="黑色"
android:textColor="@color/gry_999999"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="规格:"
android:textColor="@color/gry_999999"
android:textSize="12sp" />
<TextView
android:id="@+id/type_goods"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="普通"
android:textColor="@color/gry_999999"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="所需积分"
android:textColor="@color/theme_color"
android:textSize="12sp" />
<TextView
android:id="@+id/integral_goods"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1000"
android:layout_marginLeft="5dp"
android:textColor="@color/theme_color"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="25dp"
android:layout_gravity="bottom"
android:layout_marginBottom="5dp"
android:layout_marginRight="5dp"
android:gravity="right"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="80dp"
android:layout_height="25dp"
android:layout_gravity="right"
android:background="@color/white"
android:orientation="horizontal" >
<Button
android:id="@+id/minus"
android:layout_width="25dp"
android:layout_height="match_parent"
android:background="@drawable/kuangzi1"
android:gravity="center"
android:focusable="false"
android:text="-"
android:textColor="@color/black" >
</Button>
<TextView
android:id="@+id/number"
android:layout_width="30dp"
android:layout_height="match_parent"
android:background="@drawable/kuangzi1"
android:gravity="center"
android:inputType="number"
android:text="1"
android:textColor="@color/black" >
</TextView>
<Button
android:id="@+id/plus"
android:layout_width="25dp"
android:layout_height="match_parent"
android:background="@drawable/kuangzi1"
android:gravity="center"
android:focusable="false"
android:text="+"
android:textColor="@color/black" >
</Button>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="0.1dp"
android:background="@color/divider_color" />
</LinearLayout>
实体类:
package com.autoserve.net33.model;
public class Test {
@Override
public String toString() {
return "test [id=" + id + ", color=" + color
+ ", type=" + type + ", integral=" + integral + "]";
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getIntegral() {
return integral;
}
public void setIntegral(String integral) {
this.integral = integral;
}
private String id;
private String color;
private String type;
private String integral;
private int num;//商品数量
private int sumIntegral;
private boolean isChoosed; //商品是否在购物车中被选中
public Test(String id, String color, String type, String integral) {
super();
this.id = id;
this.color = color;
this.type = type;
this.integral = integral;
}
public Test() {
super();
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getSumIntegral() {
return sumIntegral;
}
public void setSumIntegral(int sumIntegral) {
this.sumIntegral = sumIntegral;
}
public boolean isChoosed() {
return isChoosed;
}
public void setChoosed(boolean isChoosed) {
this.isChoosed = isChoosed;
}
}
标签:Android,购物车
0
投稿
猜你喜欢
Java 实战范例之员工管理系统的实现
2023-03-31 08:09:33
Android开发Compose框架使用开篇
2023-06-08 19:14:19
C# 输出字符串到文本文件中的实现代码
2022-08-25 11:18:13
DevExpress获取TreeList可视区域节点集合的实现方法
2023-09-18 15:42:05
java实现超市管理系统
2022-06-23 13:19:06
C#使用List类实现动态变长数组的方法
2022-11-30 03:44:35
SpringBoot定时任务动态扩展ScheduledTaskRegistrar详解
2023-04-23 08:44:06
Android MVP模式实战教程
2023-09-05 13:16:54
解决使用IDEA时跳转到.class的问题
2022-07-12 20:46:37
Maven引入本地Jar包并打包进War包中的方法
2023-06-16 12:43:28
java中怎样表示圆周率
2022-11-30 11:20:00
关于Android中ListView嵌套GridView的问题
2023-09-16 10:56:39
Java Spring AOP之PointCut案例详解
2023-05-24 16:46:15
Android填坑系列:在小米系列等机型上放开定位权限后的定位请求弹框示例
2022-03-29 15:15:49
SSM Mapper文件查询出返回数据查不到个别字段的问题
2023-10-17 01:02:08
C# WebApi 接口返回值不困惑:返回值类型详解
2022-05-06 13:16:35
Spring Security登录添加验证码的实现过程
2021-07-25 23:47:17
SpringBoot Actuator潜在的OOM问题的解决
2021-08-26 06:36:43
Unity多屏幕设置的具体方案
2023-12-12 12:05:24
springcloud整合seata的实现代码
2022-04-26 23:49:49