0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenHarmony上实现待办事项功能

OpenHarmony技术社区 来源:OST开源开发者 2023-06-25 15:19 次阅读

列表的编辑模式用途十分广泛,常见于待办事项管理、文件管理、备忘录的记录管理等应用场景。

在列表的编辑模式下,新增和删除列表项是最基础的功能,其核心是对列表项对应的数据集合进行数据添加和删除。

下面以待办事项管理为例,介绍如何快速实现新增和删除列表项功能。

环境要求

本例基于以下环境开发,开发者也可以基于其他适配的版本进行开发:

IDE:DevEco Studio 3.1 Release

SDK:Ohos_sdk_public 3.2.12.5(API Version 9 Release)

新增列表项


当用户点击添加按钮时,将弹出列表项选择界面,用户点击确定后,列表中新增对应项目。


新增待办

开发步骤

定义列表项数据结构和初始化列表数据,构建列表整体布局和列表项。

以待办事项管理为例,首先定义待办事项的数据结构:

importutilfrom'@ohos.util';

exportclassToDo{
key:string=util.generateRandomUUID(true);
name:string;

constructor(name:string){
this.name=name;
}
}
然后,初始化待办事项列表和可选事项列表:
@StatetoDoData:ToDo[]=[];
privateavailableThings:string[]=['读书','运动','旅游','听音乐','看电影','唱歌'];
构建 UI 界面,初始界面包含“待办”和新增按钮“+”:
Text('待办')
.fontSize(36)
.margin({left:40})
Blank()
Text('+')
.fontWeight(FontWeight.Lighter)
.fontSize(40)
.margin({right:30})
构建列表布局并通过 ForEach 循环渲染列表项:
List({space:10}){
ForEach(this.toDoData,(toDoItem)=>{
ListItem(){
...
}
},toDoItem=>toDoItem.key)
}
为新增按钮绑定点击事件,并在事件中通过 TextPickerDialog.show 添加新增列表项的逻辑:
Text('+')
.onClick(()=>{
TextPickerDialog.show({
range:this.availableThings,//将可选事项列表配置到选择对话框中
onAccept:(value:TextPickerResult)=>{
this.toDoData.push(newToDo(this.availableThings[value.index]));//用户点击确认,将选择的数据添加到待办列表toDoData中
},
})
})

删除列表项

当用户长按列表项进入删除模式时,提供用户删除列表项选择的交互界面,用户勾选完成后点击删除按钮,列表中删除对应的项目。

长按删除待办事项

开发步骤

列表的删除功能一般进入编辑模式后才可使用,所以需要提供编辑模式的入口。

以待办列表为例,通过 LongPressGesture() 监听列表项的长按事件,当用户长按列表项时,进入编辑模式。

//ToDoListItem.ets

Flex({justifyContent:FlexAlign.SpaceBetween,alignItems:ItemAlign.Center}){
...
}
.gesture(
GestureGroup(GestureMode.Exclusive,
LongPressGesture()//监听长按事件
.onAction(()=>{
if(!this.isEditMode){
this.isEditMode=true;//进入编辑模式
this.selectedItems.push(this.toDoItem);//记录长按时选中的列表项
}
})
)
)

需要响应用户的选择交互,记录要删除的列表项数据。

在待办列表中,通过勾选框的勾选或取消勾选,响应用户勾选列表项变化,记录所有选择的列表项。

//ToDoListItem.ets

if(this.isEditMode){
Checkbox()
.onChange((isSelected)=>{
if(isSelected){
this.selectedItems.push(this.toDoItem)//勾选时,记录选中的列表项
}else{
letindex=this.selectedItems.indexOf(this.toDoItem)
if(index!==-1){
this.selectedItems.splice(index,1)//取消勾选时,则将此项从selectedItems中删除
}
}
})
...
}
需要响应用户点击删除按钮事件,删除列表中对应的选项。
//ToDoList.ets

Button('删除')
.onClick(()=>{
//删除选中的列表项对应的toDoData数据
letleftData=this.toDoData.filter((item)=>{
returnthis.selectedItems.find((selectedItem)=>selectedItem!==item);
})

this.toDoData=leftData;
this.isEditMode=false;
})
...

完整示例代码

新增和删除列表项的实现共涉及三个文件,各文件完整代码如下:

待办事项数据结构代码(ToDo.ets):

//ToDo.ets
importutilfrom'@ohos.util';

exportclassToDo{
key:string=util.generateRandomUUID(true)
name:string;

constructor(name:string){
this.name=name;
}
}
待办事项列表代码(ToDoList.ets):
//ToDoList.ets
import{ToDo}from'../model/ToDo';
import{ToDoListItem}from'./ToDoListItem';

@Entry
@Component
structToDoList{
@StatetoDoData:ToDo[]=[]
@Watch('onEditModeChange')@StateisEditMode:boolean=false
@StateselectedItems:ToDo[]=[]

privateavailableThings:string[]=["读书","运动","旅游",'听音乐','看电影','唱歌']

saveData(value:string){
this.toDoData.push(newToDo(value))
}

onEditModeChange(){
if(!this.isEditMode){
this.selectedItems=[]
}
}

build(){
Column(){
Row(){
if(this.isEditMode){
Text('X')
.fontSize(20)
.onClick(()=>{
this.isEditMode=false;
})
.margin({left:20,right:20})

Text('已选择'+this.selectedItems.length+'项')
.fontSize(24)
}else{
Text('待办')
.fontSize(36)
.margin({left:40})
Blank()
Text('+')
.fontWeight(FontWeight.Lighter)
.fontSize(40)
.margin({right:30})
.onClick(()=>{
TextPickerDialog.show({
range:this.availableThings,
onAccept:(value:TextPickerResult)=>{
this.toDoData.push(newToDo(this.availableThings[value.index]))
console.info('tododata:'+JSON.stringify(this.toDoData))
},
})
})
}
}
.height('12%')
.width('100%')

List({initialIndex:0,space:10}){
ForEach(this.toDoData,toDoItem=>{
ListItem(){
ToDoListItem({
isEditMode:$isEditMode,
toDoItem:toDoItem,
selectedItems:$selectedItems
})
}.padding({left:24,right:24,bottom:12})
},toDoItem=>toDoItem.key)
}
.height('73%')
.listDirection(Axis.Vertical)
.edgeEffect(EdgeEffect.Spring)

if(this.isEditMode){
Row(){
Button('删除')
.width('80%')
.onClick(()=>{
letleftData=this.toDoData.filter((item)=>{
returnthis.selectedItems.find((selectedItem)=>selectedItem!=item)
})
console.log('leftData:'+leftData);
this.isEditMode=false;
this.toDoData=leftData;
})
.backgroundColor('#ffd75d5d')
}
.height('15%')
}
}
.backgroundColor('#fff1f3f5')
.width('100%')
.height('100%')
}
}
待办事项代码(ToDoListItem.ets):

//ToDoListItem.ets
import{ToDo}from'../model/ToDo';

@Component
exportstructToDoListItem{
@LinkisEditMode:boolean
@LinkselectedItems:ToDo[]
privatetoDoItem:ToDo;

hasBeenSelected():boolean{
returnthis.selectedItems.indexOf(this.toDoItem)!=-1
}

build(){
Flex({justifyContent:FlexAlign.SpaceBetween,alignItems:ItemAlign.Center}){
Row({space:4}){
Circle()
.width(24)
.height(24)
.fill(Color.White)
.borderWidth(3)
.borderRadius(30)
.borderColor('#ffdcdfdf')
.margin({right:10})

Text(`${this.toDoItem.name}`)
.maxLines(1)
.fontSize(24)
.textOverflow({overflow:TextOverflow.Ellipsis})
}
.padding({left:12})

if(this.isEditMode){
Checkbox()
.select(this.hasBeenSelected()?true:false)
.onChange((isSelected)=>{
if(isSelected){
this.selectedItems.push(this.toDoItem)
}else{
letindex=this.selectedItems.indexOf(this.toDoItem)
if(index!=-1){
this.selectedItems.splice(index,1)
}
}
})
.width(24)
.height(24)
}
}
.width('100%')
.height(80)
.padding({
left:16,
right:12,
top:4,
bottom:4
})
.borderRadius(24)
.linearGradient({
direction:GradientDirection.Right,
colors:this.hasBeenSelected()?[[0xffcdae,0.0],[0xFfece2,1.0]]:[[0xffffff,0.0],[0xffffff,1.0]]
})
.gesture(
GestureGroup(GestureMode.Exclusive,
LongPressGesture()
.onAction(()=>{
if(!this.isEditMode){
this.isEditMode=true
this.selectedItems.push(this.toDoItem)
}
})
)
)
}
}

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • IDE
    IDE
    +关注

    关注

    0

    文章

    338

    浏览量

    46736
  • 文件管理
    +关注

    关注

    0

    文章

    13

    浏览量

    8897
  • SDK
    SDK
    +关注

    关注

    3

    文章

    1035

    浏览量

    45897
  • OpenHarmony
    +关注

    关注

    25

    文章

    3713

    浏览量

    16252

原文标题:OpenHarmony上实现“待办事项”功能

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    OpenHarmony开发实例:【 待办事项TodoList】

    TodoList应用是基于OpenHarmony SDK开发的安装在润和HiSpark Taurus AI Camera(Hi3516d)开发板标准系统的应用;应用主要功能是以列表的形式,展示需要完成的日程;通过本demo可以
    的头像 发表于 04-22 22:00 723次阅读
    <b class='flag-5'>OpenHarmony</b>开发实例:【 <b class='flag-5'>待办事项</b>TodoList】

    HarmonyOS开发案例:【待办列表】

    使用ArkTS声明式语法和基础组件,实现简易待办列表。效果为点击某一事项,替换标签图片、虚化文字。
    的头像 发表于 05-06 15:22 1081次阅读
    HarmonyOS开发案例:【<b class='flag-5'>待办</b>列表】

    5分钟代码挑战Flutter实现待办事项App

    代码系统架构flutter
    小凡
    发布于 :2022年09月07日 21:51:53

    5分钟代码挑战Flutter实现待办事项App

    代码系统架构flutter
    小凡
    发布于 :2022年09月09日 06:04:22

    实用待办事项APP大推荐---《Count2task 记事达人》

    更容易判别事情的优先级以及到期的压力。#1设计者认为与其告知使用者甚么日期该做甚么事情,不如让使用者直接知道他剩下多少时间,这样更能拿捏事前能准备的时间。通常我们记录待办事项, 看到日期与时间依然
    发表于 07-09 15:19

    我应该知道什么才能在fpga领域工作?

    我应该知道什么才能在fpga领域工作?我想得到一份我应该知道和练习的“待办事项”清单谢谢以上来自于谷歌翻译以下为原文what should i know best for working
    发表于 01-11 10:30

    HarmonyOS应用开发-UI设计开发与预览

    (harmony-todo)提示:开发过程完成每一步点击保存之后即可在预览界面实时预览效果3.为index页面(index.hml)添加布局信息3.1添加今日待办事项的列表<
    发表于 09-23 17:51

    app图标动效在openharmony的源码哪里实现的?

    openharmony点击一个app图标的之后,应用会从左上角一点点放大直至铺满屏幕;我想问一下这个动效是在openharmony的源码的哪里实现的?
    发表于 06-10 11:01

    卡片分拣机的制作

     我非常喜欢卡片分拣机的外观和尺寸。我对这个功能也非常满意,但正如我已经说过的那样有一些开放的待办事项
    的头像 发表于 08-26 09:54 3802次阅读
    卡片分拣机的制作

    OpenHarmony生态论坛:UROVO在OpenHarmony的规划和实践

    OpenHarmony生态论坛:UROVO在OpenHarmony的规划和实践
    的头像 发表于 04-25 17:33 1347次阅读
    <b class='flag-5'>OpenHarmony</b>生态论坛:UROVO在<b class='flag-5'>OpenHarmony</b><b class='flag-5'>上</b>的规划和实践

    如何在OpenHarmony开源代码基础实现数字管家开发宿舍全屋智能

    基于OpenAtom OpenHarmony(以下简称“OpenHarmony”)、数字管家开发宿舍全屋智能,实现碰一碰开门、碰一碰开灯、碰一碰开风扇以及烟感检测。因为各项目开发流程大体相似,本文主要以碰一碰开门为例介绍如何在现
    的头像 发表于 08-26 09:55 1822次阅读

    构建低功耗数字化的Wi-Fi待办事项列表

    电子发烧友网站提供《构建低功耗数字化的Wi-Fi待办事项列表.zip》资料免费下载
    发表于 12-23 16:03 0次下载
    构建低功耗数字化的Wi-Fi<b class='flag-5'>待办事项</b>列表

    何为自主智能体?

    想象一下,你创造了一个人工智能工具,可以为其设定目标,即使是像「创造世界最好的冰淇淋」这样模糊的目标,它也会拟出一个待办事项列表,执行待办事项,并根据进展来添加新的待办事项。随后它会
    的头像 发表于 04-28 15:50 1194次阅读
    何为自主智能体?

    10分钟快速掌握OpenHarmony社区贡献新流程

    (以下简称OpenHarmony)社区优化了Issue和PR处理流程,新支持了一系列交互命令和状态标签,用于明确处理阶段和当前处理责任人。社区CI Bot工具还提供了待办事项提醒能力,并能自动处理超期
    的头像 发表于 06-20 21:10 675次阅读

    科大讯飞会议耳机Pro 2: 具备AI会议助理与32国语言同传翻译功能

    据了解,该款产品搭载VIAIM AI进化大模型,能够智能识别提取关键播报信息,省去繁琐整理工作;并具备一键生成会议摘要和待办事项功能。用户只需讲出问题或通过文字输入,即可搜寻所需追溯信息。
    的头像 发表于 05-06 11:10 956次阅读