鸿蒙版瑞幸咖啡开发日记之首页功能实现

  • 1.需开发的功能归纳
  • 2.首页功能开发
    • 2.1 顶部TabList开发
    • 2.2 一级分类数据渲染
    • 2.3 右侧大分类模板渲染
    • 2.4 右侧具体咖啡数据渲染
    • 2.5 踩坑记录
    • 2.6 底部导航栏

其实首页的功能目前来看是简单的,后面肯定也有点单等逻辑的实现,但是本文先从获取后端数据并渲染模板这一层面展开

1.需开发的功能归纳

首页需要开发的功能主要如下所示:

  1. 前面开发日记(一)中的顶部信息栏中的TabList页签初始化
  2. 底部导航栏每一个标签模板渲染
  3. 中间菜单栏访问后端接口后,进行模板渲染,最终展示到我们的首页中去

2.首页功能开发

2.1 顶部TabList开发

我们封装了成了一个方法,在onStart方法中进行调用

public void initTabListTags(){//1.初始化中部的TabListTabList tabList = (TabList) findComponentById(ResourceTable.Id_tab_list);String[] tabListTags = {"经典菜单","9.9元♥","冰雪季❄","我的常点"};if (tabList != null){for (String tabListTag : tabListTags) {TabList.Tab tab = tabList.new Tab(this);tab.setText(tabListTag);tabList.addTab(tab);}}
}

我们来总结一下开发流程,这样下次初始化的时候也有头绪:

  1. 找到对应的TabList组件
  2. 初始化页签的名称放在一个字符串数组中
  3. 新建Tab,将字符串数组中的对应文字设置好以后添加到步骤1中的组件中

另外,我们可以发现,其实爱心图标,雪花图标都只是简单的文字符号

2.2 一级分类数据渲染

因为我们的一级分类数据都是从后端接口中拿到的,所以拿到数据后需要将数据渲染到模板文件中,然后将其添加到首页对应的布局组件中去

public void initCategory(){TaskDispatcher globalTaskDispatcher = getGlobalTaskDispatcher(TaskPriority.DEFAULT);globalTaskDispatcher.asyncDispatch(() -> {String url = "http://47.117.139.145:8080/luckin/category";String categoryString = HttpRequestUtil.sendGetRequest(this, url, null);ResultVo resultVo = gson.fromJson(categoryString,ResultVo.class);if (resultVo.getCode() == 200){String dataString = gson.toJson(resultVo.getData());List<Category> categories = gson.fromJson(dataString,new TypeToken<List<Category>>(){}.getType());// 找到需要插入模板的LayoutDirectionalLayout categoryLayout = (DirectionalLayout) findComponentById(ResourceTable.Id_first_category_layout);getUITaskDispatcher().asyncDispatch(()->{for (Category category : categories) {DirectionalLayout temCategory = (DirectionalLayout) LayoutScatter.getInstance(getContext()).parse(ResourceTable.Layout_template_category, null, false);Text categoryTxt = (Text) temCategory.findComponentById(ResourceTable.Id_category_txt);categoryTxt.setText(category.getTitle());categoryLayout.addComponent(temCategory);initFirstCoffee(category.getId(), category.getTitle(), category.getDesc());}});}});
}

2.3 右侧大分类模板渲染


我们先观察一下我在数据库设计的时候,有两行数据的记录,以两行开头,并以\n进行分割

所以在处理的时候我们利用正则split("\\\\n")进行分割进行,将相应的Text组件进行可见化desc_second.setVisibility(Component.VISIBLE);

public void initFirstCoffee(int id,String categoryTitle,String categoryDesc){// 找到需要插入模板文件的布局空间DirectionalLayout coffeeLayout = (DirectionalLayout) findComponentById(ResourceTable.Id_coffee_layout);// 渲染右侧每一个大类getUITaskDispatcher().asyncDispatch(()->{DirectionalLayout temFirstCoffee = (DirectionalLayout) LayoutScatter.getInstance(getContext()).parse(ResourceTable.Layout_template_coffee_first,null,false);Text categoryTxt = (Text) temFirstCoffee.findComponentById(ResourceTable.Id_category_title);categoryTxt.setText(categoryTitle);Text desc = (Text) temFirstCoffee.findComponentById(ResourceTable.Id_category_info);// 判断有没有换行符if (categoryDesc!=null && !categoryDesc.equals("")){if (categoryDesc.startsWith("两行")){String[] texts = categoryDesc.substring(2).split("\\\\n");Text desc_second = (Text) temFirstCoffee.findComponentById(ResourceTable.Id_category_info_second);desc.setText(texts[0]);desc_second.setText(texts[1]);desc_second.setVisibility(Component.VISIBLE);}else {desc.setText(categoryDesc);}}initCoffee(id,temFirstCoffee);coffeeLayout.addComponent(temFirstCoffee);});
}

2.4 右侧具体咖啡数据渲染

这边是最为复杂的,因为涉及到的逻辑是最多的,我们在编写逻辑之前写梳理一下有哪些逻辑需要实现:

  • 从后端获取数据进行模板渲染
  • 点击+号购买咖啡时进入详情页【我们后面开发】,并且显示-号按钮和数量文本
  • 点击-号以后如果数量为0,+数量再次隐藏

因此我们对模板中的加减按钮设置了监听事件!至于后期的价格计算和已点菜单结算栏的开发我们会在后面进行介绍!
注意:这里函数的参数里面我们携带了coffeeDirectionalLayout也就是2.3中的右侧大分类模板,这样我们才能将这个大分类下对应的具体咖啡加入到对应的布局中,以至于不会乱套!

public void initCoffee(int id,DirectionalLayout coffeeDirectionalLayout){TaskDispatcher globalTaskDispatcher = getGlobalTaskDispatcher(TaskPriority.DEFAULT);globalTaskDispatcher.asyncDispatch(() -> {String url = "http://47.117.139.145:8080/luckin/coffee?id=" + id;String coffeeString = HttpRequestUtil.sendGetRequest(this, url, null);ResultVo resultVo = gson.fromJson(coffeeString,ResultVo.class);if (resultVo.getCode() == 200){String dataString = gson.toJson(resultVo.getData());List<Coffee> coffees = gson.fromJson(dataString,new TypeToken<List<Coffee>>(){}.getType());getUITaskDispatcher().asyncDispatch(()->{for(int i = 0;i< coffees.size();i++){Coffee coffee = coffees.get(i);DirectionalLayout temCoffee = (DirectionalLayout) LayoutScatter.getInstance(getContext()).parse(ResourceTable.Layout_template_coffee, null, false);//  Image coffeeImg = (Image) temCoffee.findComponentById(ResourceTable.Id_coffee_img);//  LoadImageUtil.loadImg(this, coffee.getImage(), coffeeImg);Text coffeeTitle = (Text) temCoffee.findComponentById(ResourceTable.Id_coffee_title);coffeeTitle.setText(coffee.getTitle());Text coffeePrice = (Text) temCoffee.findComponentById(ResourceTable.Id_coffee_price);coffeePrice.setText("¥"+coffee.getPrice());//获取加减Component btn_minus =  temCoffee.findComponentById(ResourceTable.Id_minus);Component btn_add =  temCoffee.findComponentById(ResourceTable.Id_add);Text txt_num = (Text) temCoffee.findComponentById(ResourceTable.Id_num);btn_add.setClickedListener(component -> {if (btn_minus.getVisibility() == Component.HIDE) {btn_minus.setVisibility(Component.VISIBLE);txt_num.setVisibility(Component.VISIBLE);}});btn_minus.setClickedListener(component -> {int num = Integer.parseInt(txt_num.getText()) - 1;if (num >= 1){txt_num.setText(num + "");}if (num == 0) {btn_minus.setVisibility(Component.HIDE);txt_num.setVisibility(Component.HIDE);txt_num.setText(0+"");}int curTotalNum = Integer.parseInt(txt_totalNum.getText());txt_totalNum.setText(curTotalNum - 1 + "");});coffeeDirectionalLayout.addComponent(temCoffee);}});}});
}

2.5 踩坑记录

设置VISIBLE的时候只能取父组件Component,不能取具体的组件名称

2.6 底部导航栏

这边还是一样的套路,找到对应的模板,然后将图片和文本进行模板渲染【这里的ResourceTable.Media_home是指我们上面的图标,我将其放在了Media目录下】

public void initBottomTabList(){DirectionalLayout bottomLayout = (DirectionalLayout) findComponentById(ResourceTable.Id_bottom_layout);initOneBottomTab("首页",ResourceTable.Media_home,bottomLayout);initOneBottomTab("菜单",ResourceTable.Media_menu,bottomLayout);initOneBottomTab("潮品",ResourceTable.Media_chaoping,bottomLayout);initOneBottomTab("自由卡",ResourceTable.Media_card,bottomLayout);initOneBottomTab("我的",ResourceTable.Media_user,bottomLayout);
}public void initOneBottomTab(String name,int pixel,DirectionalLayout directionalLayout){getUITaskDispatcher().asyncDispatch(() -> {DependentLayout temBottom = (DependentLayout) LayoutScatter.getInstance(getContext()).parse(ResourceTable.Layout_template_bottomtab, null, false);Image image = (Image) temBottom.findComponentById(ResourceTable.Id_image);image.setPixelMap(pixel);Text text = (Text) temBottom.findComponentById(ResourceTable.Id_name);text.setText(name);directionalLayout.addComponent(temBottom);});
}

鸿蒙版瑞幸咖啡开发日记(二)首页功能实现相关推荐

  1. 鸿蒙版瑞幸咖啡开发日记(一)首页布局设计

    鸿蒙版瑞幸咖啡开发日记之首页布局设计 1.整体布局设计思路 2.三大模块开发 2.1 头部信息栏的开发 2.2 中间菜单栏的开发 2.2.1 一级分类菜单 2.2.2 二级分类菜单思路整理 2.2.3 ...

  2. 鸿蒙版瑞幸咖啡开发日记(三)购物车结算栏开发

    鸿蒙版瑞幸咖啡开发日记之已点咖啡结算栏开发 1.整体设计思路 2.购物车结算栏布局设计 2.1 右侧购物车图标 2.2 购物车结算栏 2.3 已点咖啡数量圆圈 2.4 已点咖啡模板 这里我实现的效果其 ...

  3. 鸿蒙版瑞幸咖啡开发日记(五)咖啡详情页逻辑实现

    鸿蒙版瑞幸咖啡开发日记之咖啡详情页逻辑实现 1.逻辑归纳 2.开发流程 2.1 咖啡标题 2.2 温度和糖度选择 2.3 数量选择 2.4 结算后返回 3.整体代码 我们先来看一下总体的效果 1.逻辑 ...

  4. 小程序·云开发 - 仿瑞幸咖啡小程序(一) - 从入门到辞职

    最近新开一个瑞幸咖啡小程序的项目.刚好看到小程序有新的功能 - 云开发,就开始边做边学了. 首先,开启一个新的项目的时候,勾选云开发. 新建完项目之后,小程序就可以进行云开发服务了. 需要注意的是,新 ...

  5. 瑞幸咖啡 CEO 和 COO 被暂停职务;快手起诉抖音索赔 500 万元;Wine 5.8 发布 | 极客头条...

    整理 | 屠敏 头图 | CSDN 下载自东方 IC 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦 ...

  6. 互联网晚报 | 2月7日 星期一 | 中国女足亚洲杯夺冠;瑞幸咖啡已履行1.8亿美元民事罚款;快狗打车通过港交所上市聆讯...

    今日看点 ✦ 中国女足3:2逆转韩国女足,第9次夺得亚洲杯冠军 ✦ 快狗打车通过港交所上市聆讯,2021年前三季度收入大幅上涨 ✦ 瑞幸咖啡:已履行与SEC和解相关的1.8亿美元民事处罚 ✦ 刘强东将 ...

  7. 搞砸了瑞幸咖啡,资本老炮陆正耀会把小面毁了吗?

    文/琥珀消研社 作者/白露 听说了吗?割美国韭菜请中国人喝咖啡的"带慈善家"陆正耀,老陆,又撸起袖子准备进军餐饮业了. 曾经的资本眼泪.正义铁锤.华尔街收割机,这回,估计暴打不了资 ...

  8. 多个迹象表明,瑞幸咖啡已进入新的发展阶段

    瑞幸咖啡正在引领新一轮的咖啡茶.饮产业进创新. 01 瑞幸咖啡:公司在重组计划和资本市场披露方面达到多项"里程碑式"进展 9月21日,瑞幸咖啡发布声明,公司今日发布三则公告,宣布公 ...

  9. 瑞幸咖啡,不过是又一个“逃离美团者”

    5月6日,美团宣布推出新品牌"美团配送",向社会开放运力. 5月8日,据媒体报道,瑞幸咖啡在美团App上的成交量不到500单,并正在向饿了么寻求合作,以补充外卖配送服务能力. IP ...

最新文章

  1. 三星出了个AI黑科技,不只是“换脸”这么简单
  2. 一文读懂MQTT协议
  3. win8和win8.1动态绑定数据到ListView
  4. pythonide机制_强化vim打造python的IDE
  5. java学习(24):if..else...if
  6. 论文阅读 - Group Normalization
  7. Go语言的IO库那么多,我该怎么选?
  8. 摄像头分辨率怎么调整_网络监控摄像头怎么选择 网络监控摄像头选择方法【介绍】...
  9. 实用教程丨官方下载Oracle各版本安装软件及补丁包
  10. 95-30-018-Channel-AbstractNioByteChannel
  11. sqldiag 工具
  12. 在线Excel转CSV工具
  13. Openresty支持HTTP2
  14. 【Python之旅】第四篇(四):基于面向对象的模拟人生游戏类
  15. 百倍训练效率提升,微软通用语言表示模型T-ULRv5登顶XTREME
  16. 大地主题的解算 matlab,大地主题解算.PPT
  17. C语言二进制与十进制之间的转换
  18. 如何用cocos2d-x来开发简单的Uphone游戏:(五) 打包和发布
  19. 计算机网络常用知识总结!
  20. 如何用mysql创建orders表_MySQL学习十四创建和操纵表

热门文章

  1. 《Photoshop Lightroom4 经典教程》—第1课1.4节Lightroom工作流程
  2. 【毕业设计】树莓派机器视觉小车设计与实现 - 单片机物联网 嵌入式 stm32
  3. 最新BI报表工具对比选型指标及重点注意事项---BI报表工具选型的那些事
  4. 汽车芯片保护壳体压铸缺陷模流实例
  5. python扫雷程序
  6. (三)Server和Service
  7. error expected linebreaks to be ‘lf‘ but found ‘crlf‘ linebreak-style问题解决
  8. 美通企业日报 | 年轻妈妈经常焦虑人数超过29%;雅诗兰黛集团首次亮相进博会...
  9. Git中CRLF与LF的转换
  10. 产品原型设计:使用axure动态面板实现窗口切换