# Android线上自动点餐系统 **Repository Path**: yyw0820/OrderOnline ## Basic Information - **Project Name**: Android线上自动点餐系统 - **Description**: Android线上自动点餐系统 - **Primary Language**: Android - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 5 - **Created**: 2022-11-25 - **Last Updated**: 2022-11-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README @[TOC](【Android】线上自助点餐系统) # 效果视频 [video(video-2LK5dDvS-1649834581539)(type-csdn)(url-https://live.csdn.net/v/embed/197849)(image-https://video-community.csdnimg.cn/vod-84deb4/743bebc94ee54fe5960619c71be18207/snapshots/1636efc9298b491a8dba2380d38f8950-00003.jpg?auth_key=1649831659-8a05d6bb77694d9d92637db2ded400f9-0-95dc2496a80dac8953e3ade748ff6712)(title-【Android】线上自助点餐系统)] ## 商品选购界面 ### 效果图 ### 商品数据 由于没有服务器,无法网络获取商品信息,故化繁从简,将需要的商品信息保存成xml文件,次项目将商品信息分为三个文件:标题文件,商品详细信息文件,商品图片文件。 #### 商品标题文件 ``` 把酒言欢 爆炒干锅 海鲜派对 辣度自选 素菜最爱 旺季龙虾 无肉不欢 主食饱腹 ``` #### 商品详细文件信息 由于篇幅过长,就没有显示全部商品信息,每一个商品信息分为:商品名称,商品规格,商品价格三个小类 ``` 可乐 一瓶 3.00 雪花 一瓶 5.00 怡宝 一瓶 2.00 ``` #### 商品图片 由于篇幅过长,例举部分商品图片信息 ``` @drawable/kele @drawable/xuehua @drawable/yibao ``` ### 添加商品数据 #### 解析左侧标题数据 ``` 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() { @Override public 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() { @Override public 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() { @Override public 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 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 #### 密码匹配 此控件为自定义view,具体代码不展示,有兴趣的可以观看另外一篇文章,链接已挂 [人脸支付与密码支付](https://blog.csdn.net/News53231323/article/details/122991431?spm=1001.2014.3001.5501) ``` payPassWord.setOnTextFinishListener(new PayPwdEditText.OnTextFinishListener() { @Override public 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封装](https://blog.csdn.net/News53231323/article/details/121393825?spm=1001.2014.3001.5501)可以观看另外一篇文章。 ``` sp = SP.getInstance(); money = (String) sp.GetData(PaySuccessActivity.this,"TotalPrice",""); ``` ## 历史数据图表化 此图标工具采用第三方API`hellocharts` ### 效果图 ### 数据初始化 从数据库取出购买商品数据 ``` dao = new Dao(context); goodsLists = dao.QueryAll(); Totalnum = goodsLists.size(); ``` #### X轴 从数据库中取出商品名称,并作为`X轴`数据 ``` for (int i = 0; i (); 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); } ``` # 尾言 ``` 由于篇幅原因,并未将全部代码贴出 ```