跳到教程内容
教程首页
App Inventor 2 教程 我的待办清单
准备开始
动手创造 · PROJECT LAB

我的待办清单

准备探索你的新作品
0%
★★ 项目难度每一步,都离作品更近

先了解你将做出什么

应用介绍

这次做一个真正有用的小工具:输入任务后加入清单,点选任务就能完成并移除,退出 App 再打开, 任务仍然保留。列表显示框 负责显示,微数据库 负责保存。

教程主图

我的待办清单教程(难度系数:★★)

准备界面

组件类型 组件名称 关键设置
文本输入框 文本输入框_任务 输入任务文字
按钮 按钮_添加 文本:添加
按钮 按钮_完成 文本:完成所选
按钮 按钮_清空 文本:清空全部
列表显示框 列表显示框_任务 显示任务列表
标签 标签_计数 显示任务数量
微数据库 微数据库1 非可视组件

先声明状态和刷新过程

列表数据有两个地方要同步:屏幕上的 列表显示框_任务微数据库1 里的持久数据。 把显示列表的动作集中到一个过程里,新增、删除、启动时都调用它,避免重复写同一段代码。

global 待办事项 = []
global 当前选择 = 0

procedure 刷新列表() {
  列表显示框_任务.Elements = 待办事项
  标签_计数.Text = join("共 ", length(待办事项), " 项")
}

App 启动时恢复任务

第一次打开时,微数据库1 还没有“任务”这个标签,所以给 GetValue 一个空列表作为默认值。 这样后面直接取长度、添加任务都不会遇到空值。

when Screen1.Initialize() {
  待办事项 = 微数据库1.GetValue("任务", [])
  刷新列表()
}

添加任务并保存

添加成功后要按这个顺序做四件事:把文字加入列表、保存列表、清空输入框、刷新显示。 少了最后一步,数据虽然变了,屏幕却不会马上更新。

when 按钮_添加.Click() {
  if isempty(文本输入框_任务.Text) {
    标签_计数.Text = "先输入一项任务"
  } else {
    listadd(待办事项, 文本输入框_任务.Text)
    微数据库1.StoreValue("任务", 待办事项)
    文本输入框_任务.Text = ""
    刷新列表()
  }
}

选中并完成任务

列表的下标从 1 开始,SelectionIndex 正好给出被点中项目的下标。没有选中项目时它是 0, 所以完成前先检查一下,避免删除不存在的项。

when 列表显示框_任务.AfterPicking(selection) {
  当前选择 = 列表显示框_任务.SelectionIndex
  标签_计数.Text = join("已选:", selection)
}

when 按钮_完成.Click() {
  if 当前选择 = 0 {
    标签_计数.Text = "先点选一项任务"
  } else {
    listremove(待办事项, 当前选择)
    微数据库1.StoreValue("任务", 待办事项)
    当前选择 = 0
    刷新列表()
  }
}

清空全部任务

清空时同时修改内存列表和数据库标签。只把列表设为空而不调用 ClearTag,下次启动时旧任务 又会被读回来。

when 按钮_清空.Click() {
  待办事项 = []
  当前选择 = 0
  微数据库1.ClearTag("任务")
  刷新列表()
}

开始测试

  1. 添加两三项任务,列表是否立即出现新内容。
  2. 不选任务直接点“完成所选”,是否只提示而不报错。
  3. 选中一项完成,剩余任务和数量是否正确。
  4. 完全退出 App 再打开,任务是否还在。
  5. 清空后退出重进,列表是否仍然为空。

剩余工作

可以把“完成”改成在任务前加勾选符号,或者增加优先级、截止日期;如果要多人共享,再把 微数据库 换成 云数据库,并为异步的 GotValue 事件重新设计数据流程。