上一期分享了黑马健康软件食物列表页开发代码,这一期把数据模型记录项功能给实现一下,记录项代码参照“黑马程序员—实战案例—数据模型—记录项”视频。
记录项实现的功能其实就是itemlist列表的多样化,在黑马程序所给的itemcategory文件和recorditem文件中分别保存了记录项的类型和饮食记录中的记录项。在itemlist列表中记录着多种的食物或者运动,这些食物和运动数据都保存在itemodel文件中。
为了分辨传输的数据是食物数据还是运动数据,可以把运动的那些数据id从10000开始排列,然后做一个判断,10000以上的是运动,10000以下是食物。
实现代码如下:
class ItemModel{ getById(id: number, isFood: boolean = true){ return isFood ? foods[id] : workouts[id - 10000] } list(isFood: boolean = true): RecordItem[]{ return isFood ? foods : workouts } listItemGroupByCategory(isFood: boolean = true){ // 1.判断要处理的是食物还是运动 let categories = isFood ? FoodCategories : WorkoutCategories let items = isFood ? foods: workouts // 2.创建空的分组 let groups = categories.map(itemCategory => new GroupInfo(itemCategory, [])) // 3.遍历记录项列表,将食物添加到对应的分组 items.forEach(item => groups[item.categoryId].items.push(item)) // 4.返回结果 return groups } }
用groupinfo方法对标题进行简化,代码如下:
export default class GroupInfo<TYPE, ELEMENT> { /** * 分组类型 */ type: TYPE /** * 组内数据集合 */ items: ELEMENT[] /** * 组内记录的总热量 */ calorie: number = 0 constructor(type: TYPE, items: ELEMENT[]) { this.type = type this.items = items } }
重新整合所有内容,代码如下:
ItemList.ets:
import { CommonConstants } from '../../common/constants/CommonConstants' import ItemModel from '../../model/ItemModel' import GroupInfo from '../../viewmodel/GroupInfo' import ItemCategory from '../../viewmodel/ItemCategory' import RecordItem from '../../viewmodel/RecordItem' @Component export default struct ItemList { showPanel: (item: RecordItem) => void @Prop isFood: boolean build() { Tabs() { TabContent() { this.TabContentBuilder(ItemModel.list(this.isFood)) } .tabBar('全部') ForEach( ItemModel.listItemGroupByCategory(this.isFood), (group: GroupInfo<ItemCategory, RecordItem>) => { TabContent() { this.TabContentBuilder(group.items) } .tabBar(group.type.name) }) } .width(CommonConstants.THOUSANDTH_940) .height('100%') .barMode(BarMode.Scrollable) } @Builder TabContentBuilder(items: RecordItem[]) { List({ space: CommonConstants.SPACE_10 }) { ForEach(items, (item: RecordItem) => { ListItem() { Row({ space: CommonConstants.SPACE_6 }) { Image(item.image).width(50) Column({ space: CommonConstants.SPACE_4 }) { Text(item.name).fontWeight(CommonConstants.FONT_WEIGHT_500) Text(`${item.calorie}千卡/${item.unit}`).fontSize(14).fontColor($r('app.color.light_gray')) }.alignItems(HorizontalAlign.Start) Blank() Image($r('app.media.ic_public_add_norm_filled')) .width(18) .fillColor($r('app.color.primary_color')) } .width('100%') .padding(CommonConstants.SPACE_6) } .onClick(() => this.showPanel(item)) }) } .width('100%') .height('100%') } }
如此便可以显示各种食物和运动数据了,ItemList页面多样化完成。最后,要同步itemcad的数据,所以在itemcard里定义一个双向传递的变量@Link item:RecordItem,然后把itemcard中写死的数据都改为动态。
代码如下:
ItemCard.ets:
import { CommonConstants } from '../../common/constants/CommonConstants' import RecordItem from '../../viewmodel/RecordItem' @Component export default struct ItemCard { @Prop amount: number @Link item: RecordItem build() { Column({space: CommonConstants.SPACE_8}){ // 1.图片 Image(this.item.image).width(150) // 2.名称 Row(){ Text(this.item.name).fontWeight(CommonConstants.FONT_WEIGHT_700) } .backgroundColor($r('app.color.lightest_primary_color')) .padding({top: 5, bottom: 5, left: 12, right: 12}) Divider().width(CommonConstants.THOUSANDTH_940).opacity(0.6) // 3.营养素 Row({space: CommonConstants.SPACE_8}){ this.NutrientInfo({label: '热量(千卡)', value: this.item.calorie}) if(this.item.id < 10000){ this.NutrientInfo({label: '碳水(千卡)', value: this.item.carbon}) this.NutrientInfo({label: '蛋白质(千卡)', value: this.item.protein}) this.NutrientInfo({label: '脂肪(千卡)', value: this.item.fat}) } } Divider().width(CommonConstants.THOUSANDTH_940).opacity(0.6) // 4.数量 Row(){ Column({space: CommonConstants.SPACE_4}){ Text(this.amount.toFixed(1)) .fontSize(50).fontColor($r('app.color.primary_color')) .fontWeight(CommonConstants.FONT_WEIGHT_600) Divider().color($r('app.color.primary_color')) } .width(150) Text(this.item.unit) .fontColor($r('app.color.light_gray')) .fontWeight(CommonConstants.FONT_WEIGHT_600) } } } @Builder NutrientInfo($$:{label: string, value: number}){ Column({space: CommonConstants.SPACE_8}){ Text($$.label).fontSize(14).fontColor($r('app.color.light_gray')) Text(($$.value * this.amount).toFixed(1)).fontSize(18).fontWeight(CommonConstants.FONT_WEIGHT_700) } } }
实验截图:
如此一来,黑马健康软件数据结构记录项部分代码也大功告成。