日韩精品中文字幕久久臀_天堂av在线一区_午夜精品视频网站_99r精品视频_国产日韩亚洲欧美_亚洲欧美国产一本综合首页_日本一区二区三区久久久久久久久不 _国产精品高潮视频_久热99视频在线观看_91伊人久久大香线蕉

焦點關注:如何實現列表項的新增和刪除—OpenHarmony

2023-06-15 05:30:51 來源:清一色財經

下面以待辦事項管理為例,介紹如何快速實現新增和刪除列表項功能。


(相關資料圖)

想了解更多關于開源的內容,請訪問:

清一色開源基礎軟件社區

https://ost.51cto.com

場景介紹

列表的編輯模式用途十分廣泛,常見于待辦事項管理、文件管理、備忘錄的記錄管理等應用場景。在列表的編輯模式下,新增和刪除列表項是最基礎的功能,其核心是對列表項對應的數據集合進行數據添加和刪除。

下面以待辦事項管理為例,介紹如何快速實現新增和刪除列表項功能。

環境要求

本例基于以下環境開發,開發者也可以基于其他適配的版本進行開發:

IDE: DevEco Studio 3.1 ReleaseSDK: Ohos_sdk_public 3.2.12.5(API Version 9 Release)

新增列表項

如下圖所示,當用戶點擊添加按鈕時,將彈出列表項選擇界面,用戶點擊確定后,列表中新增對應項目。

圖17新增待辦

開發步驟

定義列表項數據結構和初始化列表數據,構建列表整體布局和列表項。以待辦事項管理為例,首先定義待辦事項的數據結構:

import util from "@ohos.util";export class ToDo {  key: string = util.generateRandomUUID(true);  name: string;  constructor(name: string) {    this.name = name;  }}

然后,初始化待辦事項列表和可選事項列表:

@State toDoData: ToDo[] = [];private availableThings: 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(new ToDo(this.availableThings[value.index])); // 用戶點擊確認,將選擇的數據添加到待辦列表toDoData中      },    })  })

刪除列表項

如下圖所示,當用戶長按列表項進入刪除模式時,提供用戶刪除列表項選擇的交互界面,用戶勾選完成后點擊刪除按鈕,列表中刪除對應的項目。

圖18長按刪除待辦事項

開發步驟

列表的刪除功能一般進入編輯模式后才可使用,所以需要提供編輯模式的入口。以待辦列表為例,通過LongPressGesture()監聽列表項的長按事件,當用戶長按列表項時,進入編輯模式。

// ToDoListItem.etsFlex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) {  ...}.gesture(GestureGroup(GestureMode.Exclusive,  LongPressGesture() // 監聽長按事件    .onAction(() => {      if (!this.isEditMode) {        this.isEditMode = true; //進入編輯模式        this.selectedItems.push(this.toDoItem); // 記錄長按時選中的列表項      }    })  ))

需要響應用戶的選擇交互,記錄要刪除的列表項數據。在待辦列表中,通過勾選框的勾選或取消勾選,響應用戶勾選列表項變化,記錄所有選擇的列表項。

// ToDoListItem.etsif (this.isEditMode) {  Checkbox()    .onChange((isSelected) => {      if (isSelected) {        this.selectedItems.push(this.toDoItem) // 勾選時,記錄選中的列表項      } else {        let index = this.selectedItems.indexOf(this.toDoItem)        if (index !== -1) {          this.selectedItems.splice(index, 1) // 取消勾選時,則將此項從selectedItems中刪除        }      }    })    ...}

需要響應用戶點擊刪除按鈕事件,刪除列表中對應的選項。

// ToDoList.etsButton("刪除")  .onClick(() => {    // 刪除選中的列表項對應的toDoData數據    let leftData = this.toDoData.filter((item) => {      return this.selectedItems.find((selectedItem) => selectedItem !== item);    })    this.toDoData = leftData;    this.isEditMode = false;  })  ...

完整示例代碼

新增和刪除列表項的實現共涉及三個文件,各文件完整代碼如下:

待辦事項數據結構代碼(ToDo.ets):

// ToDo.etsimport util from "@ohos.util";export class ToDo {  key: string = util.generateRandomUUID(true)  name: string;  constructor(name: string) {    this.name = name;  }}

待辦事項列表代碼(ToDoList.ets):

// ToDoList.etsimport { ToDo } from "../model/ToDo";import { ToDoListItem } from "./ToDoListItem";@Entry@Componentstruct ToDoList {  @State toDoData: ToDo[] = []  @Watch("onEditModeChange") @State isEditMode: boolean = false  @State selectedItems: ToDo[] = []  private availableThings: string[] = ["讀書", "運動", "旅游", "聽音樂", "看電影", "唱歌"]  saveData(value: string) {    this.toDoData.push(new ToDo(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(new ToDo(this.availableThings[value.index]))                    console.info("to do data: " + 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(() => {              let leftData = this.toDoData.filter((item) => {                return this.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.etsimport { ToDo } from "../model/ToDo";@Componentexport struct ToDoListItem {  @Link isEditMode: boolean  @Link selectedItems: ToDo[]  private toDoItem: ToDo;  hasBeenSelected(): boolean {    return this.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 {              let index = 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)        }      })    )    )  }}

想了解更多關于開源的內容,請訪問:

清一色開源基礎軟件社區

https://ost.51cto.com

關鍵詞:

相關新聞

日韩精品中文字幕久久臀_天堂av在线一区_午夜精品视频网站_99r精品视频_国产日韩亚洲欧美_亚洲欧美国产一本综合首页_日本一区二区三区久久久久久久久不 _国产精品高潮视频_久热99视频在线观看_91伊人久久大香线蕉
久久综合久久综合亚洲| 久久精品国产精品青草| 日本一区二区电影| 国内久久婷婷综合| 国产精品全国免费观看高清| 色婷婷综合激情| 欧美成人一区二区三区片免费| 99久久精品国产网站| 中文字幕av一区 二区| 亚洲一区在线免费观看| 欧美一区午夜视频在线观看| 中文字幕第一区第二区| 国产无一区二区| 欧美一级爆毛片| 欧美一级片免费看| 欧美色大人视频| 欧美久久久久久久久久| 成人精品一区二区三区中文字幕| 国产主播一区二区| 极品美女销魂一区二区三区| 国产精品素人视频| 日韩西西人体444www| 亚洲色图.com| 国产色婷婷亚洲99精品小说| 精品一区二区三区在线播放视频| 亚洲激情自拍偷拍| 国产suv一区二区三区88区| 免费人成精品欧美精品| 日韩欧美视频在线| 国产偷国产偷精品高清尤物| 国产精品一区二区黑丝| www..com久久爱| 色婷婷综合久久久中文一区二区| 91精品国产黑色紧身裤美女| 欧美国产在线观看| 一区二区三区欧美在线观看| 久久国产生活片100| 一区二区三区精品视频在线| 国产一区二区三区最好精华液| yourporn久久国产精品| 日韩女优电影在线观看| 亚洲第一主播视频| 99久久婷婷国产综合精品电影| 国产成人免费高清| 国产99久久久久| 欧美日韩亚洲丝袜制服| 一区二区在线观看免费| 蜜桃精品视频在线| 欧美日韩中字一区| 亚洲柠檬福利资源导航| 国产精品系列在线| 久久精品欧美日韩精品 | 欧美区一区二区三区| 亚洲欧美日韩人成在线播放| 成人aa视频在线观看| 久久精品亚洲乱码伦伦中文| 国产一区二区三区免费看| 精品国产一区二区精华| 老司机精品视频一区二区三区| 精品国产一区二区三区av性色| 免费成人av在线播放| 久久综合视频网| 麻豆国产欧美日韩综合精品二区| 欧美一级高清大全免费观看| 国产在线精品一区二区| 亚洲午夜久久久久中文字幕久| 一本大道久久精品懂色aⅴ| 激情综合色播激情啊| 午夜成人在线视频| 亚洲在线中文字幕| 综合久久给合久久狠狠狠97色| 精品国精品自拍自在线| 久久久久久影视| 国产不卡在线一区| 成人h动漫精品一区二区| 午夜精品久久久久久久| 91精品国产综合久久精品| 制服.丝袜.亚洲.另类.中文| 一本一道久久a久久精品| 国产一区二区三区四区在线观看| 日韩激情在线观看| 欧美一区二区三区成人| 在线精品视频一区二区三四| 91网站在线观看视频| 99久久国产综合精品麻豆| 国产精品一级片在线观看| 美国毛片一区二区| 奇米一区二区三区| 经典一区二区三区| 高清久久久久久| 一区二区三区毛片| 亚洲成年人网站在线观看| 3atv一区二区三区| 中文字幕精品在线不卡| 亚洲综合另类小说| 精品综合久久久久久8888| 久久国产夜色精品鲁鲁99| 91免费观看视频在线| 欧美一区二区三级| 国产精品卡一卡二卡三| 欧美亚洲图片小说| 亚洲另类色综合网站| 亚洲视频一二三| 欧美卡1卡2卡| 欧美日韩中文字幕一区二区| 国产三级精品视频| 日韩影院免费视频| 国产黄人亚洲片| 成人午夜电影网站| 中文字幕不卡在线播放| 久久99精品久久久久久久久久久久| 99久久精品一区| 中文字幕在线观看一区二区| 国产传媒日韩欧美成人| 91精品麻豆日日躁夜夜躁| 久久九九99视频| 91精品啪在线观看国产60岁| 香蕉乱码成人久久天堂爱免费| 国产亚洲综合av| 人妖欧美一区二区| 国产成人亚洲精品青草天美| 国产露脸91国语对白| 99久免费精品视频在线观看| 亚洲综合在线观看视频| 日韩av成人高清| 日本va欧美va瓶| 欧美色图在线观看| 国产suv精品一区二区6| 亚洲精品高清在线| 国产亚洲成av人在线观看导航| 欧美日韩欧美一区二区| 国产精品久99| 欧美一a一片一级一片| 美腿丝袜亚洲三区| 一区二区三区四区在线| 日韩欧美中文字幕一区| 99久久精品国产麻豆演员表| 亚洲伊人色欲综合网| 久久精品国产一区二区三区免费看 | 精品在线观看视频| 午夜精品一区二区三区免费视频 | ●精品国产综合乱码久久久久| 国产激情一区二区三区四区 | 日本一区二区三区电影| 91成人国产精品| 99re8在线精品视频免费播放| 国产精品嫩草久久久久| 日韩亚洲欧美在线观看| 欧美唯美清纯偷拍| 在线观看免费亚洲| 91小视频在线观看| 色综合久久中文字幕综合网 | 精品国产伦一区二区三区免费| 在线免费观看不卡av| 99久久夜色精品国产网站| 成人综合婷婷国产精品久久免费| 寂寞少妇一区二区三区| 国产综合成人久久大片91| 国产二区国产一区在线观看| 亚洲色图色小说| 久88久久88久久久| 国产精品1区二区.| a亚洲天堂av| 日韩一区二区免费在线电影 | 欧美优质美女网站| 欧日韩精品视频| 26uuu另类欧美| 日韩激情中文字幕| 成人黄色av网站在线| 精品久久久久香蕉网| 亚洲小说欧美激情另类| 亚洲手机成人高清视频| 激情欧美一区二区| 99国产欧美另类久久久精品| 日韩精品中文字幕一区二区三区| 亚洲成av人片在www色猫咪| 国产一区二区三区av电影| 成人免费观看男女羞羞视频| 欧美一级黄色大片| 国产精品嫩草影院av蜜臀| 国产精品一区在线观看你懂的| 欧美三级中文字幕| 蜜臀国产一区二区三区在线播放 | 日韩免费电影一区| 国产亚洲综合性久久久影院| 亚洲精品videosex极品| 欧美色涩在线第一页| 狠狠网亚洲精品| 精品国产网站在线观看| 亚洲午夜精品在线| 日韩一区二区三区在线| 风间由美一区二区av101| 尤物视频一区二区| 国产欧美一区二区精品性色超碰| 国产白丝网站精品污在线入口| 亚洲伦理在线免费看| 国产欧美精品一区| 久久久99免费| 国产精品妹子av| 亚洲欧美成aⅴ人在线观看|