【Android】实现简易购物车功能(附源码)

先上结果:
在这里插入图片描述

代码:

首先引入图片加载:

implementation 'com.github.bumptech.glide:glide:4.15.1'

在这里插入图片描述
配置权限清单:

    <!-- 网络权限 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

在这里插入图片描述

页面布局:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="#2196F3">
        <TextView
            android:id="@+id/personalCenterText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="购物车"
            android:textColor="#ffffff"
            android:textSize="24sp" />

        <TextView
            android:id="@+id/edit"
            android:text="编辑"
            android:textColor="@color/white"
            android:textSize="24sp"
            android:layout_marginEnd="10dp"
            android:layout_centerVertical="true"
            android:layout_alignParentEnd="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </RelativeLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="0dp"/>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp">
        <CheckBox
            android:id="@+id/allSelect"
            android:text="全选"
            android:layout_centerVertical="true"
            android:textColor="@color/colorAccent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <TextView
            android:id="@+id/total"
            android:textSize="20sp"
            android:text="合计0.00¥"
            android:textColor="@color/colorAccent"
            android:layout_centerVertical="true"
            android:layout_toStartOf="@id/pay"
            android:layout_marginEnd="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <Button
            android:id="@+id/pay"
            android:text="结算"
            android:textColor="@color/white"
            android:background="@drawable/button_red"
            android:layout_width="100dp"
            android:layout_alignParentEnd="true"
            android:layout_height="wrap_content"/>
    </RelativeLayout>

</LinearLayout>

条目布局:item_cart.xml

<?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="100dp">
    <CheckBox
        android:id="@+id/checkbox"
        android:layout_centerVertical="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <ImageView
        android:id="@+id/cover"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:layout_margin="10dp"
        android:layout_toEndOf="@id/checkbox" />
    <LinearLayout
        android:layout_toEndOf="@id/cover"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:textSize="18sp"
            android:textColor="@color/black"
            android:maxLines="2"
            android:ellipsize="end"
            android:layout_marginTop="5dp" />
        <TextView
            android:id="@+id/price"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textColor="#D32F2F"
            android:textStyle="bold"
            android:layout_marginTop="5dp" />
    </LinearLayout>
    <LinearLayout
        android:id="@+id/view_number"
        android:layout_width="wrap_content"
        android:layout_height="23dp"
        android:background="@drawable/shape_cart_item_add_cut_border"
        android:divider="@drawable/shape_divider_1_v"
        android:orientation="horizontal"
        android:showDividers="middle"
        android:layout_marginBottom="10dp"
        android:layout_marginEnd="10dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true">

        <TextView
            android:id="@+id/tv_reduce"
            android:layout_width="27dp"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="-"
            android:textColor="#676767"
            android:textSize="15sp"/>

        <TextView
            android:id="@+id/tv_num"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:minWidth="40dp"
            android:paddingHorizontal="12dp"
            android:singleLine="true"
            android:text="1"
            android:textColor="#676767"
            android:textSize="15sp"/>

        <TextView
            android:id="@+id/tv_add"
            android:layout_width="27dp"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="+"
            android:textColor="#676767"
            android:textSize="15sp"/>
    </LinearLayout>
</RelativeLayout>

资源文件:shape_cart_item_add_cut_border.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle"
       android:visible="true">
    <!-- 描边,边框 -->
    <stroke
        android:width="1px"
        android:color="#E0E0E0"/><!--dashGap虚线段的间距、dashWidth虚线段的长度-->
</shape>

shape_divider_1_v.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle"
       android:visible="true">
    <size
        android:width="1px"/><!-- 宽度和高度 -->
    <!-- 填充 -->
    <solid
        android:color="#E0E0E0"/><!-- 填充的颜色 -->
</shape>

适配器:CartAdapter

public class CartAdapter extends RecyclerView.Adapter<CartAdapter.Holder> {
    private final List<CartBean> list;
    private final Context context;
    private final List<CartBean> selects=new ArrayList<>();

    public CartAdapter(List<CartBean> list, Context context) {
        this.list = list;
        this.context = context;
    }

    @NonNull
    @Override
    public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(context).inflate(R.layout.item_cart,null,false);
        return new Holder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull Holder holder, int position) {
        CartBean cartBean =list.get(position);
        holder.name.setText(cartBean.getName());
        holder.number.setText(String.valueOf(cartBean.getNumber()));
        holder.price.setText(String.format("%1$.2f¥", cartBean.getPrice()));
        holder.reduce.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int n;
                n = Integer.parseInt(holder.number.getText().toString());
                if (n >1){
                    n = n -1;
                    holder.number.setText(String.valueOf(n));
                    cartBean.setNumber(n);
                }
                else {
                    Toast.makeText(context,"最少选择一件",Toast.LENGTH_SHORT).show();
                }
                updateItem();
            }
        });
        holder.add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int n;
                n = Integer.parseInt(holder.number.getText().toString());
                n = n + 1;
                cartBean.setNumber(n);
                holder.number.setText(String.valueOf(n));
                updateItem();
            }
        });
        holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                cartBean.setSelect(b);
                updateItem();
            }
        });
        holder.checkBox.setChecked(cartBean.isSelect());
        Glide.with(context).load(cartBean.getCover()).into(holder.cover);
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public static class Holder extends RecyclerView.ViewHolder{
        CheckBox checkBox;
        ImageView cover;
        TextView name,number,reduce,add,price;
        public Holder(@NonNull View itemView) {
            super(itemView);
            checkBox=itemView.findViewById(R.id.checkbox);
            cover=itemView.findViewById(R.id.cover);
            name=itemView.findViewById(R.id.name);
            number=itemView.findViewById(R.id.tv_num);
            reduce=itemView.findViewById(R.id.tv_reduce);
            add=itemView.findViewById(R.id.tv_add);
            price=itemView.findViewById(R.id.price);
        }
    }
    private void updateItem(){
        selects.clear();
        for (CartBean cartBean:list){
            if (cartBean.isSelect()){
                selects.add(cartBean);
            }
        }
        onChange.change(selects);
    }
    public OnChange onChange;

    public void setOnChange(OnChange onChange) {
        this.onChange = onChange;
    }

    public List<CartBean> getSelects() {
        return selects;
    }
    //条目改变-接口回调
    public interface OnChange{
        void change(List<CartBean> selects);
    }
}

bean类:CartBean

public class CartBean {
    private String name;
    private String cover;
    private boolean isSelect;
    private int number;
    private double price;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCover() {
        return cover;
    }

    public void setCover(String cover) {
        this.cover = cover;
    }

    public boolean isSelect() {
        return isSelect;
    }

    public void setSelect(boolean select) {
        isSelect = select;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public CartBean(String name, String cover, boolean isSelect, int number, double price) {
        this.name = name;
        this.cover = cover;
        this.isSelect = isSelect;
        this.number = number;
        this.price = price;
    }

    @Override
    public String toString() {
        return "CartBean{" +
                "name='" + name + '\'' +
                ", cover='" + cover + '\'' +
                ", isSelect=" + isSelect +
                ", number=" + number +
                ", price=" + price +
                '}';
    }
}

源码

github:https://github.com/panzhusheng/CartDemo
gitee:https://gitee.com/pan-zs/cart-demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/353609.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习300问】16、逻辑回归模型实现分类的原理?

在上一篇文章中&#xff0c;我初步介绍了什么是逻辑回归模型&#xff0c;从它能解决什么问题开始介绍&#xff0c;并讲到了它长什么样子的。如果有需要的小伙伴可以回顾一下&#xff0c;链接我放在下面啦&#xff1a; 【机器学习300问】15、什么是…

【前端web入门第一天】02 HTML图片标签 超链接标签 音频标签 视频标签

文章目录: 1.HTML图片标签 1.1 图像标签-基本使用1.2 图像标签-属性1.3 路径 1.3.1 相对路径 1.3.2 绝对路径 2.超链接标签 3.音频标签 4.视频标签 1.HTML图片标签 1.1 图像标签-基本使用 作用:在网页中插入图片。 <img src"图片的URL">src用于指定图像…

Kong: Services and Routes 等基本属性

Services 在Kong Gateway中&#xff0c;服务是现有上游应用程序的抽象。服务可以存储插件配置和策略等对象的集合&#xff0c;并且可以与路由相关联。 定义服务时&#xff0c;管理员会提供名称和上游应用程序连接信息。连接详细信息可以在 url 字段中以单个字符串的形式提供…

Kotlin 教程(环境搭建)

Kotlin IntelliJ IDEA环境搭建 IntelliJ IDEA 免费的社区版下载地址&#xff1a;Download IntelliJ IDEA – The Leading Java and Kotlin IDE 下载安装后&#xff0c;我们就可以使用该工具来创建项目&#xff0c;创建过程需要选择 SDK&#xff0c; Kotlin 与 JDK 1.6 一起使…

【c语言】人生重开模拟器

前言&#xff1a; 人生重开模拟器是前段时间非常火的一个小游戏&#xff0c;接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 1.实现一个简化版的人生重开模拟器 &#xff08;1&#xff09; 游戏开始的时候&#xff0c;设定初始属性&#xff1a;颜值&#xf…

新建一个基于标准库的工程(STM32)

目录 1.新建存放工程的文件夹 2.打开KEIL5软件 3.新建一个本次工程的文件夹 4.添加工程的必要文件 4.1打开STM32的启动文件 ​编辑 4.2&#xff1a; 4.3添加内核寄存器文件 ​编辑 5.回到keil5软件&#xff0c;将刚才复制的那些文件添加到工程中 5.1添加一个启动文件&am…

【服务器数据恢复】EqualLogic存储磁盘坏道导致存储不可用的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 某公司IT部门一台某品牌EqualLogic PS6100系列存储在运行过程中突然崩溃。 服务器管理员对故障服务器存储进行初步检查&#xff0c;经过检测发现导致该服务器存储无法正常工作的原因是该存储中raid5磁盘阵列内有2块硬盘出现故障离线&a…

VitePress-03-标题锚点的使用与文档内部链接跳转

说明 本文介绍如下内容&#xff1a; 1、vitepress 中 md 文件中的标题锚点 2、锚点的使用 &#xff1a; 文档内部的快速跳转 锚点 什么是锚点 锚点 &#xff1a; 通俗的理解就是一个位置标记&#xff0c;通过这个标记可以快速的进行定位。 【vitepress 中&#xff0c;md 文档的…

LeetCode 40.组合总和 II

组合总和 II 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 方法一、回溯 由于题目要求解集…

day23 其他事件(页面加载事件、页面滚动事件)

目录 页面加载事件页面/元素滚动事件页面滚动事件——获取位置 页面加载事件 加载外部资源&#xff08;如图片、外联CSS和JavaScript等&#xff09;加载完毕时触发的事件为什么使用&#xff1a; 有时候需要等页面资源全部处理完毕再做一些事老代码喜欢把script写在head中&…

CentOS使用

1.使用SSH连接操作虚拟机中的CentOS 使用代理软件(MobaX/Xshell)通过ssh连接vmware中的虚拟机,可以摆脱vmware笨重的软件,直接在代理软件中进行操作. 包括使用云虚拟器,其实也只是在本地通过ssh连接别处的云服务商的硬件而已. 1.1 配置静态IP 为什么要配置静态IP? 想要使用…

【Linux 内核源码分析】多核调度分析

多核调度 SMP&#xff08;Symmetric Multiprocessing&#xff0c;对称多处理&#xff09;是一种常见的多核处理器架构。它将多个处理器集成到一个计算机系统中&#xff0c;并通过共享系统总线和内存子系统来实现处理器之间的通信。 首先&#xff0c;SMP架构将一组处理器集中在…

leetcode hot100岛屿数量

本题中要求统计岛屿数量&#xff08;数字1的上下左右均为1&#xff0c;则是连续的1&#xff0c;称为一块岛屿&#xff09;。那么这种类型题都是需要依靠深度优先搜索&#xff08;DFS&#xff09;或者广度优先搜索&#xff08;BFS&#xff09;来做的。这两种搜索&#xff0c;实际…

【开源】基于JAVA+Vue+SpringBoot的民宿预定管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…

第2章-神经网络的数学基础——python深度学习

第2章 神经网络的数学基础 2.1 初识神经网络 我们来看一个具体的神经网络示例&#xff0c;使用 Python 的 Keras 库 来学习手写数字分类。 我们这里要解决的问题是&#xff0c; 将手写数字的灰度图像&#xff08;28 像素28 像素&#xff09;划分到 10 个类别 中&#xff08;0…

【动态规划】【逆向思考】【C++算法】960. 删列造序 III

作者推荐 【动态规划】【map】【C算法】1289. 下降路径最小和 II 本文涉及知识点 动态规划汇总 LeetCode960. 删列造序 III 给定由 n 个小写字母字符串组成的数组 strs &#xff0c;其中每个字符串长度相等。 选取一个删除索引序列&#xff0c;对于 strs 中的每个字符串&a…

STM正点mini-跑马灯

一.库函数版 1.硬件连接 &#xff27;&#xff30;&#xff29;&#xff2f;的输出方式&#xff1a;推挽输出 &#xff29;&#xff2f;口输出为高电平时&#xff0c;P-MOS置高&#xff0c;输出为&#xff11;&#xff0c;LED对应引脚处为高电平&#xff0c;而二极管正&#…

【代码随想录-数组】螺旋矩阵 II

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

《动手学深度学习(PyTorch版)》笔记4.7

Chapter4 Multilayer Perceptron 4.7 Forward/Backward Propagation and Computational Graphs 本节将通过一些基本的数学和计算图&#xff0c;深入探讨反向传播的细节。首先&#xff0c;我们将重点放在带权重衰减&#xff08; L 2 L_2 L2​正则化&#xff09;的单隐藏层多层…

SQL注入:盲注

SQL注入系列文章&#xff1a; 初识SQL注入-CSDN博客 SQL注入&#xff1a;联合查询的三个绕过技巧-CSDN博客 SQL注入&#xff1a;报错注入-CSDN博客 目录 什么是盲注&#xff1f; 布尔盲注 手工注入 使用python脚本 使用sqlmap 时间盲注 手工注入 使用python脚本 使…