成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何實現(xiàn)列表項的新增和刪除—OpenHarmony

系統(tǒng) OpenHarmony
下面以待辦事項管理為例,介紹如何快速實現(xiàn)新增和刪除列表項功能。

想了解更多關于開源的內(nèi)容,請訪問:

51CTO 開源基礎軟件社區(qū)

https://ost.51cto.com

場景介紹

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

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

環(huán)境要求

本例基于以下環(huán)境開發(fā),開發(fā)者也可以基于其他適配的版本進行開發(fā):

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

新增列表項

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

如何實現(xiàn)列表項的新增和刪除(OpenHarmony)-開源基礎軟件社區(qū)

圖17 新增待辦

開發(fā)步驟

定義列表項數(shù)據(jù)結(jié)構(gòu)和初始化列表數(shù)據(jù),構(gòu)建列表整體布局和列表項。
以待辦事項管理為例,首先定義待辦事項的數(shù)據(jù)結(jié)構(gòu):

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[] = ['讀書', '運動', '旅游', '聽音樂', '看電影', '唱歌'];

構(gòu)建UI界面。
初始界面包含“待辦”和新增按鈕“+”:

Text('待辦')
  .fontSize(36)
  .margin({ left: 40})
Blank()
Text('+')
  .fontWeight(FontWeight.Lighter)
  .fontSize(40)
  .margin({ right: 30 })

構(gòu)建列表布局并通過ForEach循環(huán)渲染列表項:

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])); // 用戶點擊確認,將選擇的數(shù)據(jù)添加到待辦列表toDoData中
      },
    })
  })

刪除列表項

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

如何實現(xiàn)列表項的新增和刪除(OpenHarmony)-開源基礎軟件社區(qū)

圖18 長按刪除待辦事項

開發(fā)步驟

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

// ToDoListItem.ets

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

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

// ToDoListItem.ets

if (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.ets

Button('刪除')
  .onClick(() => {
    // 刪除選中的列表項對應的toDoData數(shù)據(jù)
    let leftData = this.toDoData.filter((item) => {
      return this.selectedItems.find((selectedItem) => selectedItem !== item);
    })

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

完整示例代碼

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

待辦事項數(shù)據(jù)結(jié)構(gòu)代碼(ToDo.ets):

// ToDo.ets
import util from '@ohos.util';

export class ToDo {
  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
struct 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.ets
import { ToDo } from '../model/ToDo';

@Component
export 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)
        }
      })
    )
    )
  }
}

想了解更多關于開源的內(nèi)容,請訪問:

51CTO 開源基礎軟件社區(qū)

https://ost.51cto.com

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區(qū)
相關推薦

2024-04-30 11:02:15

二級聯(lián)動鴻蒙開源

2023-08-24 16:42:29

Sample聊天實例應用

2022-03-24 14:58:02

Java散列表編程語言

2022-05-31 15:27:11

CSS動畫

2024-01-10 17:27:00

Python開發(fā)

2024-04-01 09:42:16

2022-03-14 10:02:03

散列表鏈表哈希表

2023-06-05 15:00:13

書籍翻頁動效鴻蒙

2010-07-07 16:53:54

SQL Server重

2024-06-20 11:11:07

2022-11-11 07:48:56

ORM鏈式輪播圖

2022-11-15 07:50:47

ORM鏈式操作刪除

2023-02-13 15:59:17

鴻蒙Beta5源碼

2022-07-25 14:17:04

JS應用開發(fā)

2022-12-14 17:42:48

軍棋工兵算法

2017-03-13 10:11:28

AndroidRecyclerVie功能介紹

2022-04-15 14:57:57

Flex布局鴻蒙操作系統(tǒng)

2023-07-17 16:13:21

組件模塊開發(fā)的鴻蒙

2009-06-11 10:35:49

圖像下拉列表imgdiv
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久一二区| 欧洲一区视频 | 欧美一区二区在线观看 | 精品少妇一区二区三区日产乱码 | 一区二区三区在线 | 日韩精品一区二区三区中文在线 | 欧美激情五月 | 日日操日日干 | av一级| 国产91观看| 91精品无人区卡一卡二卡三 | 91免费入口 | 久草成人网 | 天天宗合网 | 欧美激情亚洲激情 | 国产成人精品午夜 | 视频一区二区在线观看 | 麻豆久久久久久久 | 亚洲视频一区在线 | 人人叉| 久久久久久久久久久高潮一区二区 | 欧美激情综合 | av片网| 伦理片97| 一区二区免费看 | 久久1区| 国产视频福利 | 永久精品| 成人在线中文字幕 | 免费毛片在线 | 国产伊人精品 | 999免费网站 | 涩涩导航| 国产精品亚洲视频 | 国产一区二区免费在线 | 欧美一a一片一级一片 | 国产中文原创 | 成人福利在线观看 | 中国美女av | 成人小视频在线 | 欧美日韩亚洲国产 |