【Android】线上自助点餐系统

【Android】线上自助点餐系统

  • 效果视频
    • 商品选购界面
      • 效果图
      • 商品数据
        • 商品标题文件
        • 商品详细文件信息
        • 商品图片
      • 添加商品数据
        • 解析左侧标题数据
        • 解析右侧商品数据
      • 左侧标题与右侧商品双向绑定
      • 加减按钮监听
      • 所选商品存入数据库
    • 商品复选
      • 效果图
      • 取出商品数据
      • 商品清空
      • 商品增删
    • 支付界面
      • 效果图
        • 密码匹配
    • 支付成功
      • 效果图
      • SharedPreferences
    • 历史数据图表化
      • 效果图
      • 数据初始化
        • X轴
        • Y轴
  • 尾言

效果视频

【Android】线上自助点餐系统

商品选购界面

效果图

商品数据

由于没有服务器,无法网络获取商品信息,故化繁从简,将需要的商品信息保存成xml文件,次项目将商品信息分为三个文件:标题文件,商品详细信息文件,商品图片文件。

商品标题文件

<resources><string-array name="title"><item>把酒言欢</item><item>爆炒干锅</item><item>海鲜派对</item><item>辣度自选</item><item>素菜最爱</item><item>旺季龙虾</item><item>无肉不欢</item><item>主食饱腹</item></string-array>
</resources>

商品详细文件信息

由于篇幅过长,就没有显示全部商品信息,每一个商品信息分为:商品名称,商品规格,商品价格三个小类

<?xml version="1.0" encoding="utf-8"?>
<resources><string-array name="content">
<!--        title:把酒言欢--><item>可乐</item><item>一瓶</item><item>3.00</item><item>雪花</item><item>一瓶</item><item>5.00</item><item>怡宝</item><item>一瓶</item><item>2.00</item></string-array></resources>

商品图片

由于篇幅过长,例举部分商品图片信息

<resources><integer-array name="icon"><item>@drawable/kele</item><item>@drawable/xuehua</item><item>@drawable/yibao</item></integer-array>
</resources>

添加商品数据

解析左侧标题数据

    private void InitTitle(){String[] titleArray = getResources().getStringArray(R.array.title);for (int i = 0; i < titleArray.length; i++) {goodsTitle = new Goods.GoodsTitle(titleArray[i],i );titleList.add( goodsTitle );}}

解析右侧商品数据

private void InitContent(){TypedArray iconArray = getResources().obtainTypedArray(R.array.icon);int index = 0;String[] content = getResources().getStringArray(R.array.content);for (int i = 0; i < content.length ; i+=3) {//if (index < iconArray.length())/*把酒言欢*/if ( i < 3){goodsContent = new Goods.GoodsContent(  iconArray.getResourceId(index++,0), content[i], content[i+1], Float.parseFloat(content[i+2]),R.drawable.icon_add,R.drawable.icon_sub,0,0 );}else if (i < 8){/*爆炒干锅*/goodsContent = new Goods.GoodsContent( iconArray.getResourceId(index++,0), content[i], content[i+1], Float.parseFloat(content[i+2]),R.drawable.icon_add,R.drawable.icon_sub,0,1 );}else if ( i  < 12){/*海鲜派对*/goodsContent = new Goods.GoodsContent( iconArray.getResourceId(index++,0), content[i], content[i+1], Float.parseFloat(content[i+2]),R.drawable.icon_add,R.drawable.icon_sub,0,2 );}else if ( i < 16){/*辣度自选*/goodsContent = new Goods.GoodsContent( iconArray.getResourceId(index++,0), content[i], content[i+1], Float.parseFloat(content[i+2]),R.drawable.icon_add,R.drawable.icon_sub,0,3 );}else if ( i < 22){/*素菜最爱*/goodsContent = new Goods.GoodsContent( iconArray.getResourceId(index++,0), content[i], content[i+1], Float.parseFloat(content[i+2]),R.drawable.icon_add,R.drawable.icon_sub,0,4 );}else if ( i < 25){/*旺季龙虾*/goodsContent = new Goods.GoodsContent( iconArray.getResourceId(index++,0), content[i], content[i+1], Float.parseFloat(content[i+2]),R.drawable.icon_add,R.drawable.icon_sub,0,5 );}else if ( i < 28){/*无肉不欢*/goodsContent = new Goods.GoodsContent( iconArray.getResourceId(index++,0), content[i], content[i+1], Float.parseFloat(content[i+2]),R.drawable.icon_add,R.drawable.icon_sub,0,6 );}else/*主食饱腹*/goodsContent = new Goods.GoodsContent( iconArray.getResourceId(index++,0), content[i], content[i+1], Float.parseFloat(content[i+2]),R.drawable.icon_add,R.drawable.icon_sub,0,7 );contentList.add( goodsContent );}}

左侧标题与右侧商品双向绑定

我们在添加左侧标题的时候有一个参数,为每一个小类的标识。同样在添加商品数据的时候,根据商品所属小类进行了分类。

private void InitListener(){titleAdapter.setOnItemClickListener( new BaseQuickAdapter.OnItemClickListener() {@Overridepublic void onItemClick(BaseQuickAdapter adapter, View view, int position) {String[] titleArray = getResources().getStringArray(R.array.title);titleAdapter.setSelection( position );titleAdapter.notifyDataSetChanged();contentManager.scrollToPositionWithOffset( titleArray.length,0 );}} );mGoodsContent.addOnScrollListener( new RecyclerView.OnScrollListener() {@Overridepublic void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {super.onScrolled( recyclerView, dx, dy );int firstPosition = contentManager.findFirstVisibleItemPosition();goodsContent = contentList.get(firstPosition);int subId = goodsContent.getSubId();int pos = 0;for (int i = 0; i < titleList.size(); i++) {int id = titleList.get(i).getId();if ((subId == id)) {pos = i;}}titleAdapter.setSelection(pos);//mGoodsTitle.scrollToPosition( pos );titleAdapter.notifyDataSetChanged();}} );

加减按钮监听

对每一个商品的加减按钮进行点击事件监听

 contentAdapter.setOnItemChildClickListener( new BaseQuickAdapter.OnItemChildClickListener() {@Overridepublic void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {double  Price = contentList.get( position ).getPrice();switch (view.getId()){case R.id.Add:int numberAdd = contentList.get( position ).getNumber();numberAdd++;Monetary(Price);contentList.get( position ).setNumber( numberAdd );contentAdapter.notifyDataSetChanged();//Toast.makeText( FunctionActivity.this,"Add"+Price,Toast.LENGTH_SHORT ).show();break;case R.id.Sub:int numberSub = contentList.get( position ).getNumber();if (numberSub > 0 ){numberSub--;contentList.get( position ).setNumber( numberSub );LessMoney(Price);}else if (numberSub < 0){contentList.get( position ).setNumber( 0 );}contentAdapter.notifyDataSetChanged();//Toast.makeText( FunctionActivity.this,"Sub"+Price,Toast.LENGTH_SHORT ).show();break;}}} );

并且每次点击事件更新所选商品总额,并且对所选商品下限设定为15元,方才能进行支付。

 private void Monetary(double Money){TotalMoney+=Money;money.setText( doubleToString(TotalMoney) );if (TotalMoney > 15){MoreThanStyle();}else {LessStyle();}}private void LessMoney(double Money){TotalMoney-=Money;if (TotalMoney < 15){LessStyle();money.setText( 0+"" );}else {MoreThanStyle();money.setText( doubleToString(TotalMoney) );}}

所选商品存入数据库

将所选的商品信息保存到数据库,方便对其进行存取

private void GotoSettlement(){String user = (String) sp.GetData(FunctionActivity.this,"UserName_login","");String pass = (String) sp.GetData(FunctionActivity.this,"PassWord_login","");for (int i = 0; i <contentList.size() ; i++) {int num = contentList.get( i ).getNumber();if (num > 0){/*插入数据为null*///Toast.makeText( context,""+num,Toast.LENGTH_SHORT ).show();goodsList = new GoodsList(user,pass, contentList.get( i ).getGoodsIMG(),contentList.get( i ).getContent(),contentList.get( i ).getPrice(),contentList.get( i ).getNumber(),R.drawable.icon_sub,R.drawable.icon_add );dao.Insert( goodsList );}}}

商品复选

此界面可以对所选商品进行复选,可以看见商品总额,并对其进行最后确认

效果图

取出商品数据

从数据库中将用户所选商品进行取出,并添加到此适配器中

 private void InitData(){goodsLists = dao.QueryAll();for (int i = 0; i <goodsLists.size() ; i++) {goodsList = new GoodsList(goodsLists.get(i).getUserName(),goodsLists.get(i).getPassWord(), goodsLists.get( i ).getImg(),goodsLists.get( i ).getName(),goodsLists.get( i ).getPrice(),goodsLists.get( i ).getNumber(),goodsLists.get( i ).getSub(),goodsLists.get( i ).getAdd() );dataList.add( goodsList );}}

商品清空

将适配器中所有子项删除

goodsAllClear.setOnClickListener( new View.OnClickListener() {@Overridepublic void onClick(View v) {goodsListAdapter.removeAllItem( dataList );goodsTotalNumber.setText( 0+"" );goodsTotalPrice.setText( 0+"" );}} );

商品增删

private void Listener(){goodsListAdapter.setOnItemChildClickListener( new BaseQuickAdapter.OnItemChildClickListener() {@Overridepublic void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {int num = dataList.get( position ).getNumber();double price = dataList.get( position ).getPrice();switch (view.getId()){case R.id.goodsAdd:goodsListAdapter.addPrice(dataList,price,position,num);InitBarData();//Toast.makeText( GoodsListActivity.this,"Add"+num,Toast.LENGTH_SHORT ).show();break;case R.id.goodsSub:goodsListAdapter.subPrice(dataList,price,position,num);InitBarData();//Toast.makeText( GoodsListActivity.this,"Sub"+num,Toast.LENGTH_SHORT ).show();break;}}} );}

支付界面

效果图

密码匹配

此控件为自定义view,具体代码不展示,有兴趣的可以观看另外一篇文章,链接已挂
人脸支付与密码支付

payPassWord.setOnTextFinishListener(new PayPwdEditText.OnTextFinishListener() {@Overridepublic void onFinish(String str) {String Pay = "000000";if (str.equals( Pay )){toastFormat.setText("支付成功");toastFormat.show();startActivity(new Intent(PaymentActivity.this,PaySuccessActivity.class));}else {toastFormat.setText("密码错误");toastFormat.show();payPassWord.clearText();}}});

支付成功

效果图

SharedPreferences

利用SharedPreferences完成数据传递,关于SharedPreferences封装可以观看另外一篇文章。

sp = SP.getInstance();money = (String) sp.GetData(PaySuccessActivity.this,"TotalPrice","");

历史数据图表化

此图标工具采用第三方APIhellocharts

效果图

数据初始化

从数据库取出购买商品数据

 dao = new Dao(context);goodsLists = dao.QueryAll();Totalnum = goodsLists.size();

X轴

从数据库中取出商品名称,并作为X轴数据

for (int i = 0; i <goodsLists.size() ; i++) {title.add(goodsLists.get(i).getName());}

Y轴

分为内外两层循环,外循环觉得总的小类,内循环决定一个小类有几根柱子;例如:用户购买了4个商品,分别显示商品的价格以及数量,则外循环为4,内循环为2;

 for (int j = 0; j < Totalnum ; j++) {mPointValues = new ArrayList<>();for (int i = 0; i < single; i++) {mPointValues.add(new SubcolumnValue((goodsLists.get(j).getPrice()), color.get(j)));//值的大小、颜色//设置X轴的柱子所对应的属性名称(底部文字)axisXValues.add(new AxisValue(j).setLabel(title.get(j)));}Column column = new Column(mPointValues);ColumnChartValueFormatter chartValueFormatter = new SimpleColumnChartValueFormatter(2);column.setFormatter(chartValueFormatter);column.setHasLabelsOnlyForSelected(false);column.setHasLabels(true);//column.setValues(mPointValues);//将每个属性得列全部添加到List中//添加了7个大柱子Column,单个大柱子里面mPointValues大小为3(自行调整)columns.add(column);}

尾言

由于篇幅原因,并未将全部代码贴出

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

点餐系统的开发,php后台+微信小程序 实现完整的餐厅点餐系统。

对于我们的日常生活来说&#xff0c;微信点餐小程序使用十分广泛&#xff0c;使用微信小程序进行点餐已经成为如今的新餐饮消费方式之一&#xff0c;小程序的入口就隐藏在微信中&#xff0c;背靠微信大流量平台&#xff0c;坐拥数以万计的用户。对于商家来说&#xff0c;使用微…

chatgpt弄的 简单的点餐系统 不知道怎么样

点餐系统可以提高餐厅的效率和客户的体验&#xff0c;因此在许多情况下非常有用。 对于餐厅&#xff0c;点餐系统可以帮助管理顾客的订单&#xff0c;包括快速和准确地获取顾客的点餐信息&#xff0c;避免了人工点餐的错误&#xff0c;减少服务员的工作负担&#xff0c;提高服务…

17行python代码,openai帮你实现下班自由

chatgpt最近火到不行&#xff0c;AI受到了前所未有的关注&#xff0c;openai作为开发团队不仅仅开发了一个在线尝鲜的聊天机器人&#xff0c;也提供API并且提供了python语言的的pypi库。 火出圈的聊天机器人是chatgpt3,既然排行老三&#xff0c;就说明这个张飞的前面还有大哥刘…

安卓手机超强的悬浮窗工具

看到一个挺好用的安卓悬浮窗工具&#xff0c;仅作分享 该款工具是安卓上的一款应用&#xff0c;名字叫fooView 安装之后便会出现在手机主界面中的左下方或者是右下方&#xff01; 怎样操控球球&#xff1f; 按住它&#xff0c;向上滑动即可打开程序和文件管理器。也可以直接…

[日常折腾之码上归一]多种编程语言打印当前系统时间

之前做PIC粒子模拟时程序通常跑好几天&#xff0c;为了对比不同网格、粒子数等条件下的运行天数&#xff0c;我养成了一个在程序运行程序开始和程序运行结束分别打印当前时间戳的习惯&#xff0c;并坚持了3个多月。下面结合自己的实践经历&#xff0c;分别使用不同编程语言打印…

chatgpt赋能python:Python免费编程软件介绍

Python免费编程软件介绍 Python是一种功能强大且易于学习的编程语言&#xff0c;因此在全球范围内受到广泛使用。除了许多付费的编程软件外&#xff0c;Python还拥有许多优秀的免费编程软件&#xff0c;为用户带来了更多的选择和方便。以下将扼要介绍几个著名的Python免费编程…

线性插值和双线性插值

先讲一下线性插值: 已知数据 (x0, y0) 与 (x1, y1),要计算 [x0, x1] 区间内某一位置 x 在直线上的y值(反过来也是一样,略) 上面比较好理解吧,仔细看就是用x和x0,x1的距离作为一个权重,用于y0和y1的加权。离哪个点近,那个点对最后的值共享越多。双线性插值本质上就是…

MATLAB复习高等数学下册(8.0)

Matlab是一款科学计算软件&#xff0c;可用于数据分析、图形绘制、模型建立、算法设计和数值计算等方面。Matlab使用MATrix LABoratory的缩写&#xff0c;即矩阵实验室&#xff0c;最初是为数值计算和线性代数而设计的&#xff0c;但后来也扩展到了其他领域&#xff0c;如图像和…

C++调用matlab编译动态库方法及相关问题解决

目录 参考链接&#xff1a;1、C调用matlab代码的方法1.1、Library Compiler 方法1.1.1、功能1.1.2、参考链接1.1.3、matlab编译动态库方法1.1.4、C 使用matlab编译动态库的传参方法1.1.4.1、演示把一个cv::Mat单通道影像传入matlab编译的dll中,解析matlab返回的变量1.1.4.2、下…

【Matlab】画一只简单的小猫

这个其实是用ChatGPT生成的 % 定义猫的轮廓点坐标 x [-1 -1 -0.5 -0.5 0.5 0.5 1 1]; y [0.5 -0.5 -1 -0.5 -0.5 -1 -0.5 0.5];% 绘制猫的轮廓 plot(x, y, LineWidth, 2);% 添加猫的眼睛 hold on; plot(-0.4, 0.2, ko, MarkerFaceColor, k, MarkerSize, 6); plot(0.4, 0.2, …

MATLAB中CVX工具箱解决凸优化问题的基本知识——语法、变量声明、目标函数、约束条件、cvx编程错误及解决方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、语法二、变量声明三、目标函数四、约束条件五、函数六、cvx特有的数学运算表达式七、常见错误八、进阶阅读参考资料 前言 本文是在最近学习MATLAB CVX工具…

记一次累累累的过往:在Linux环境下的项目实现

写在前面&#xff1a;当你看到这篇文章的时候&#xff0c;我有可能已经完成了这个实训&#xff0c;这是边做边写的一个叙事流&#xff0c;或者是什么私心分享流&#xff09;。 大书记官艾尔海森为你写诗:) 任务背景&#xff1a; 在任意环境下实现ARP欺骗&#xff08;主&#…

Prompt learning 教学[技巧篇]:通过增加示例、引导词、特殊符号指令等方式让chatgpt输出更好的答案

Prompt learning 教学[技巧篇]&#xff1a;通过增加示例、引导词、特殊符号指令等方式让chatgpt输出更好的答案 技巧1&#xff1a;To Do and Not To Do 在问答场景里&#xff0c;为了让 AI 回答更加准确&#xff0c;一般会在问题里加条件。比如让 AI 推荐一部电影给你 Recomme…

对含有中英文的文本去除停用词 结巴分词

对含有中英文的文本去除停用词 分词 这里的停用词表可以自己定义或者采用网上的 是文本分类 情感分析进行预处理的步骤 from collections import Counter import jieba**# jieba.load_userdict(userdict.txt) **# 创建停用词list**** def stopwordslist(filepath):stopwords …

一、(4) 结巴分词词性提取

一、&#xff08;4&#xff09; 结巴分词词性提取 代码如下&#xff1a; # -*- coding: utf-8 -*- """ Created on Tue May 14 14:45:01 2019author: sun """ import jieba.posseg as psg import codecs# 建立结果保存路径 result codecs.ope…

结巴分词加字典分词词性标注

1 代码 import jieba import jieba.posseg as pseg jieba.load_userdict("data/entity_noun_dic.txt") jieba.add_word(word"重置", tag"v") jieba.del_word("送别") jieba.del_word("人流量")result pseg.cut("请问光…

使用斯坦福分词器进行词性标注

使用斯坦福分词器进行词性标注 文章目录 使用斯坦福分词器进行词性标注前言一、斯坦福分词器是什么&#xff1f;二、使用步骤1.去官网下载工具包2.导入库3.斯坦福模型功能的介绍4.分词结果展示5.分词结果进行分析 三、总结 前言 中文分词是中文文本处理的一个基础步骤&#xf…

力扣 139. 单词拆分

一、题目描述 给你一个字符串 s 和一个字符串列表 word_dict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s "leetcode"…

文本分析-使用jieba库进行中文分词和去除停用词(附案例实战)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

解单词拆分问题

问题描述&#xff1a; 题目&#xff1a;Leetcode第139题 难度&#xff1a;中等 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重…