服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android Studio实现简单购物车功能

Android Studio实现简单购物车功能

2022-03-10 15:31攀岩嘉 Android

这篇文章主要为大家详细介绍了Android Studio实现简单购物车,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android Studio实现简单购物车的具体代码,供大家参考,具体内容如下

MainActivity的布局文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  tools:context=".MainActivity">
 
  <LinearLayout
    android:id="@+id/top_bar"
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:background="#E24146"
    android:orientation="vertical" >
    <TextView
      android:id="@+id/title"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:gravity="center"
      android:minHeight="48dp"
      android:text="购物车"
      android:textColor="#ffffff"
      android:textSize="17sp" />
  </LinearLayout>
 
  <ListView
    android:id="@+id/listview"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:childIndicator="@null"
    android:groupIndicator="@null" >
  </ListView>
 
  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:orientation="horizontal" >
 
    <LinearLayout
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="2.5"
      android:gravity="center_vertical"
      android:orientation="horizontal" >
 
      <CheckBox
        android:id="@+id/all_chekbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="4dp"
        android:checkMark="?android:attr/listChoiceIndicatorMultiple"
        android:gravity="center"
        android:minHeight="64dp"
        android:paddingLeft="10dp"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:visibility="visible" />
 
      <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:text="合计:"
        android:textSize="16sp"
        android:textStyle="bold" />
 
      <TextView
        android:id="@+id/tv_total_price"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="¥0.00"
        android:textSize="16sp"
        android:textStyle="bold" />
    </LinearLayout>
 
    <TextView
      android:id="@+id/tv_delete"
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="1"
      android:clickable="true"
      android:background="#a29e9e"
      android:gravity="center"
      android:text="删除"
      android:textColor="#FAFAFA" />
 
    <TextView
      android:id="@+id/tv_go_to_pay"
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="1"
      android:background="#E24146"
      android:clickable="true"
      android:gravity="center"
      android:text="付款(0)"
      android:textColor="#FAFAFA" />
  </LinearLayout>
</LinearLayout>

条目的布局文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">
 
 
  <View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:background="#CCCCCC" />
 
  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >
 
    <CheckBox
      android:id="@+id/check_box"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center_vertical"
      android:layout_marginLeft="10dp"
      android:layout_marginRight="4dp"
      android:checkMark="?android:attr/listChoiceIndicatorMultiple"
      android:gravity="center"
      android:minHeight="64dp"
      android:minWidth="32dp"
      android:textAppearance="?android:attr/textAppearanceLarge"
      android:visibility="visible" />
 
    <ImageView
      android:id="@+id/iv_adapter_list_pic"
      android:layout_width="85dp"
      android:layout_height="85dp"
      android:layout_marginBottom="15dp"
      android:layout_marginTop="13dp"
      android:scaleType="centerCrop"
      android:src="@mipmap/ic_launcher"
       />
 
    <RelativeLayout
      android:layout_width="wrap_content"
      android:layout_height="match_parent"
      android:layout_gravity="center_vertical"
      android:layout_marginTop="10dp"
      android:layout_marginLeft="13dp" >
 
      <TextView
        android:id="@+id/tv_goods_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        android:layout_marginTop="20dp"
        android:ellipsize="end"
        android:maxLines="2"
        android:text="商品"
        android:textSize="14sp" />
 
      <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="30dp"
        android:orientation="horizontal" >
 
        <TextView
          android:id="@+id/tv_goods_price"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_centerVertical="true"
          android:singleLine="true"
          android:textSize="14sp"
          android:textStyle="bold"
          android:text="价格"/>
 
        <TextView
          android:id="@+id/tv_type_size"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_centerVertical="true"
          android:layout_marginLeft="10dp"
          android:layout_toRightOf="@+id/tv_goods_price"
          android:singleLine="true"
          android:textSize="10sp"/>
 
        <LinearLayout
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_alignParentRight="true"
          android:layout_centerVertical="true"
          android:layout_marginRight="15dp"
          android:orientation="horizontal" >
 
          <TextView
            android:id="@+id/tv_reduce"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:gravity="center"
            android:background="#ccc"
            android:text="一"
            android:textSize="12sp" />
 
          <TextView
            android:id="@+id/tv_num"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:gravity="center"
            android:singleLine="true"
            android:text="1"
            android:textSize="12sp" />
 
          <TextView
            android:id="@+id/tv_add"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:gravity="center"
            android:text="十"
            android:background="#ccc"
            android:textSize="12sp" />
        </LinearLayout>
      </RelativeLayout>
    </RelativeLayout>
  </LinearLayout>
 
</LinearLayout>

CartAdapter适配器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
public class CaetAdapter extends BaseAdapter {
 
  private Context context;
  private List<HashMap<String, String>> list;
  private HashMap<String, Integer> pitchOnMap;
 
  public HashMap<String, Integer> getPitchOnMap() {
    return pitchOnMap;
  }
 
  public void setPitchOnMap(HashMap<String, Integer> pitchOnMap) {
    this.pitchOnMap = pitchOnMap;
  }
 
  public CaetAdapter(Context context, List<HashMap<String, String>> list) {
    this.context = context;
    this.list = list;
 
    pitchOnMap = new HashMap<>();
    for (int i = 0; i < list.size(); i++) {
      pitchOnMap.put(list.get(i).get("id"), 0);
    }
  }
 
  @Override
  public int getCount() {
    return list.size();
  }
 
  @Override
  public Object getItem(int position) {
    return list.get(position);
  }
 
  @Override
  public long getItemId(int position) {
    return position;
  }
 
  @Override
  public View getView(final int position, View convertView, ViewGroup parent) {
    convertView = View.inflate(context, R.layout.item_layout, null);
    final CheckBox checkBox;
    ImageView icon;
    final TextView name, price, num, type, reduce, add;
 
    checkBox = convertView.findViewById(R.id.check_box);
    icon = convertView.findViewById(R.id.iv_adapter_list_pic);
    name = convertView.findViewById(R.id.tv_goods_name);
    price = convertView.findViewById(R.id.tv_goods_price);
    type = convertView.findViewById(R.id.tv_type_size);
    num = convertView.findViewById(R.id.tv_num);
    reduce = convertView.findViewById(R.id.tv_reduce);
    add = convertView.findViewById(R.id.tv_add);
 
    name.setText(list.get(position).get("name"));
    price.setText("¥ " + (Integer.valueOf(list.get(position).get("price"))) * (Integer.valueOf(list.get(position).get("count"))));
    type.setText(list.get(position).get("type"));
    num.setText(list.get(position).get("count"));
 
    if(pitchOnMap.get(list.get(position).get("id"))== 0){
      checkBox.setChecked(false);
    }else{
      checkBox.setChecked(true);
    }
 
    checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
      @Override
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if(checkBox.isChecked()){
          pitchOnMap.put(list.get(position).get("id"),1);
        }else{
          pitchOnMap.put(list.get(position).get("id"), 0);
        }
        mrefreshPriceInterface.refreshPrice(pitchOnMap);
      }
    });
 
    //商品数量减
    reduce.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        if (Integer.valueOf(list.get(position).get("count")) <= 1) {
          Toast.makeText(context, "数量不能再减啦,只能删除!", Toast.LENGTH_SHORT).show();
        } else {
          list.get(position).put("count", (Integer.valueOf(list.get(position).get("count")) - 1) + "");
          notifyDataSetChanged();
        }
        mrefreshPriceInterface.refreshPrice(pitchOnMap);
      }
    });
    //商品数量加
    add.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        list.get(position).put("count", (Integer.valueOf(list.get(position).get("count")) + 1) + "");
        notifyDataSetChanged();
        mrefreshPriceInterface.refreshPrice(pitchOnMap);
 
      }
 
    });
 
    return convertView;
  }
 
  /**
   * 创建接口
   */
  public interface RefreshPriceInterface {
    /**
     * 把价格展示到总价上
     * @param pitchOnMap
     */
    void refreshPrice(HashMap<String, Integer> pitchOnMap);
  }
 
  /**
   * 定义一个接口对象
   */
  private RefreshPriceInterface mrefreshPriceInterface;
 
  /**
   * 向外部暴露一个方法
   * 把价格展示到总价上
   * @param refreshPriceInterface
   */
  public void setRefreshPriceInterface(RefreshPriceInterface refreshPriceInterface) {
    mrefreshPriceInterface = refreshPriceInterface;
  }
 
 
}

MainActivity

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
public class MainActivity extends AppCompatActivity implements View.OnClickListener,CaetAdapter.RefreshPriceInterface{
 
  private LinearLayout top_bar;
  private ListView listview;
  private CheckBox all_chekbox;
  private TextView price;
  private TextView delete;
  private TextView tv_go_to_pay;
 
  private List<User> goodsList;
  private UserDao userDao;
  private List<HashMap<String,String>> listmap=new ArrayList<>();
  private CaetAdapter adapter;
 
   private double totalPrice = 0.00;
  private int totalCount = 0;
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
  }
 
  private void initView() {
    top_bar = (LinearLayout) findViewById(R.id.top_bar);
    listview = (ListView) findViewById(R.id.listview);
    all_chekbox = (CheckBox) findViewById(R.id.all_chekbox);
    price = (TextView) findViewById(R.id.tv_total_price);
    delete = (TextView) findViewById(R.id.tv_delete);
    tv_go_to_pay = (TextView) findViewById(R.id.tv_go_to_pay);
 
    all_chekbox.setOnClickListener(this);
    delete.setOnClickListener(this);
    tv_go_to_pay.setOnClickListener(this);
 
    initDate();
    adapter = new CaetAdapter(MainActivity.this, listmap);
    listview.setAdapter(adapter);
    adapter.setRefreshPriceInterface(this);
  }
 
  @Override
  public void onClick(View v) {
    switch (v.getId()) {
      case R.id.all_chekbox:
        AllTheSelected();
        break;
      case R.id.tv_delete:
        checkDelete(adapter.getPitchOnMap());
        break;
      case R.id.tv_go_to_pay:
        if(totalCount<=0){
          Toast.makeText(this,"请选择要付款的商品~",Toast.LENGTH_SHORT).show();
        }else{
          Toast.makeText(this,"付款成功",Toast.LENGTH_SHORT).show();
        }
        break;
    }
  }
  /**
   * 数据
   */
  private void initDate() {
    //创建集合
    goodsList = new ArrayList<>();
    //数据库
    userDao = Myapplication.getInstances().getDaoSession().getUserDao();
    userDao.deleteAll();
    //数据源
    for (int i = 0; i < 10; i++) {
      //向数据库存放数据
      User user = new User((long) i,
          "购物车里的第" + (i + 1) + "件商品",
          (i + 20) + "码",
          "10",
          "10");
      userDao.insert(user);
    }
    //从数据库中把数据放到集合中
    goodsList=userDao.loadAll();
    //把结合中的数据放到HashMap集合中
    for(int i=0;i<goodsList.size();i++){
      HashMap<String,String> map=new HashMap<>();
      map.put("id",goodsList.get(i).getId()+"");
      map.put("name",goodsList.get(i).getName());
      map.put("type",(goodsList.get(i).getType()));
      map.put("price",goodsList.get(i).getPrice()+"");
      map.put("count",goodsList.get(i).getCount()+"");
      listmap.add(map);
    }
  }
 
  @Override
  public void refreshPrice(HashMap<String, Integer> pitchOnMap) {
    priceControl(pitchOnMap);
  }
 
  /**
   * 控制价格展示总价
   */
  private void priceControl(Map<String, Integer> pitchOnMap){
    totalCount = 0;
    totalPrice = 0.00;
    for(int i=0;i<listmap.size();i++){
      if(pitchOnMap.get(listmap.get(i).get("id"))==1){
        totalCount=totalCount+Integer.valueOf(listmap.get(i).get("count"));
        double goodsPrice=Integer.valueOf(listmap.get(i).get("count"))*Double.valueOf(listmap.get(i).get("price"));
        totalPrice=totalPrice+goodsPrice;
      }
    }
    price.setText(" ¥ "+totalPrice);
    tv_go_to_pay.setText("付款("+totalCount+")");
  }
 
  /**
   * 删除 控制价格展示总价
   * @param map
   */
  private void checkDelete(Map<String,Integer> map){
    List<HashMap<String,String>> waitDeleteList=new ArrayList<>();
    Map<String,Integer> waitDeleteMap =new HashMap<>();
    for(int i=0;i<listmap.size();i++){
      if(map.get(listmap.get(i).get("id"))==1){
        waitDeleteList.add(listmap.get(i));
        waitDeleteMap.put(listmap.get(i).get("id"),map.get(listmap.get(i).get("id")));
      }
  }
    listmap.removeAll(waitDeleteList);
    map.remove(waitDeleteMap);
    priceControl(map);
    adapter.notifyDataSetChanged();
  }
  /**
   *全选或反选
   */
  private void AllTheSelected(){
    HashMap<String,Integer> map=adapter.getPitchOnMap();
    boolean isCheck=false;
    boolean isUnCheck=false;
    Iterator iter = map.entrySet().iterator();
    while (iter.hasNext()) {
      Map.Entry entry = (Map.Entry) iter.next();
 
      if(Integer.valueOf(entry.getValue().toString())==1){
        isCheck=true;
      }else{
        isUnCheck=true;
      }
    }
    if(isCheck==true&&isUnCheck==false){//已经全选,做反选
      for(int i=0;i<listmap.size();i++){
        map.put(listmap.get(i).get("id"),0);
      }
      all_chekbox.setChecked(false);
    }else if(isCheck==true && isUnCheck==true){//部分选择,做全选
      for(int i=0;i<listmap.size();i++){
        map.put(listmap.get(i).get("id"),1);
      }
      all_chekbox.setChecked(true);
    }else if(isCheck==false && isUnCheck==true){//一个没选,做全选
      for(int i=0;i<listmap.size();i++){
        map.put(listmap.get(i).get("id"),1);
      }
      all_chekbox.setChecked(true);
    }
    priceControl(map);
    adapter.setPitchOnMap(map);
    adapter.notifyDataSetChanged();
  }
 
}

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

原文链接:https://blog.csdn.net/qpdb19981023/article/details/80848088

延伸 · 阅读

精彩推荐