鸿蒙应用开发-自定义可删除列表弹窗

news2024/11/14 19:06:45

功能介绍:

自定义列表弹窗,可以对弹窗的列表点击删除,参考文档创建列表,自定义弹窗文档自定义弹窗(CustomDialog)。

知识点:

  1. 熟悉对List控件的使用。
  2. 熟悉对List点击删除
  3. 熟悉自定义弹窗。

使用环境:

  • API 9
  • DevEco Studio 4.0 Release
  • Windows 11
  • Stage模型
  • ArkTS语言

所需权限:

  1. 无需权限

效果图:

在这里插入图片描述

核心代码:

src/main/ets/model/Intention.ets是定义列表内容的实体类:

export class Intention {
  key: string
  name: string

  constructor(name: string) {
    this.key = `${Date.now()}_${Math.floor(Math.random() * 1000)}`
    this.name = name
  }
}

src/main/ets/model/IntentionDataSource.ets是列表的操作类。

import { Intention } from './Intention';

class BasicDataSource implements IDataSource {
  private listeners: DataChangeListener[] = [];
  private originDataArray: Array<Intention> = new Array<Intention>();

  public totalCount(): number {
    return 0;
  }

  public getData(index: number): Intention {
    return this.originDataArray[index];
  }

  registerDataChangeListener(listener: DataChangeListener): void {
    if (this.listeners.indexOf(listener) < 0) {
      console.info('add listener');
      this.listeners.push(listener);
    }
  }

  unregisterDataChangeListener(listener: DataChangeListener): void {
    const pos = this.listeners.indexOf(listener);
    if (pos >= 0) {
      console.info('remove listener');
      this.listeners.splice(pos, 1);
    }
  }

  notifyDataReload(): void {
    this.listeners.forEach(listener => {
      listener.onDataReloaded();
    })
  }

  notifyDataAdd(index: number): void {
    this.listeners.forEach(listener => {
      listener.onDataAdd(index);
    })
  }

  notifyDataChange(index: number): void {
    this.listeners.forEach(listener => {
      listener.onDataChange(index);
    })
  }

  notifyDataDelete(index: number): void {
    this.listeners.forEach(listener => {
      listener.onDataDelete(index);
    })
  }
}

export class IntentionDataSource extends BasicDataSource {
  private dataArray: Array<Intention> = new Array<Intention>();

  public totalCount(): number {
    return this.dataArray.length;
  }

  public getData(index: number): Intention {
    return this.dataArray[index];
  }

  public getAllData(): Array<Intention>{
    return this.dataArray
  }

  public addData(index: number, data: Intention): void {
    this.dataArray.splice(index, 0, data);
    this.notifyDataAdd(index);
  }

  public pushData(data: Intention): void {
    this.dataArray.push(data);
    this.notifyDataAdd(this.dataArray.length - 1);
  }

  public pushDataArray(data: Array<Intention>): void {
    this.dataArray.push(...data);
    this.notifyDataAdd(this.dataArray.length - 1);
  }

  public deleteData(index: number): void {
    this.dataArray.splice(index, 1);
    this.notifyDataDelete(index);
  }

  public reloadData(): void {
    this.notifyDataReload();
  }
}

src/main/ets/view/CustomDialog.ets是自定义弹窗。

import { Intention } from '../model/Intention'
import { IntentionDataSource } from '../model/IntentionDataSource'

@CustomDialog
export struct AddIntentionDialog {
  private controller: CustomDialogController
  private intentionListDataSource: IntentionDataSource
  cancel: () => void
  confirm: (intentions:Array<Intention>) => void

  build() {
    Column() {
      Text('任务列表')
        .fontSize(22)
        .fontWeight(FontWeight.Bold)
        .margin({ top: 20, bottom: 20 })

      List({ space: 5 }) {
        LazyForEach(this.intentionListDataSource, (item: Intention, index: number) => {
          ListItem() {
            Row() {
              Column() {
                Text(item?.name)
                  .padding(5)
              }
              .width('50%')
              .alignItems(HorizontalAlign.Center)

              Column() {
                Button('删除')
                  .onClick(() => {
                    // 删除数据
                    this.intentionListDataSource.deleteData(index)
                    // 重置所有子组件的index索引
                    this.intentionListDataSource.reloadData()
                  })
              }
              .width('50%')
              .alignItems(HorizontalAlign.Center)
            }
            .width('100%')
          }
        }, (item: Intention, index: number) => item.key + index.toString()) // 不能忽略这个
      }
      .width('100%')

      Flex({ justifyContent: FlexAlign.SpaceAround }) {
        Button("取消")
          .onClick(() => {
            this.controller.close()
            this.cancel()
          })
          .fontColor(Color.Black)
          .backgroundColor(Color.Pink)
          .margin({ top: 20, bottom: 20 })
        Button("确定")
          .onClick(() => {
            this.controller.close()
            this.confirm(this.intentionListDataSource.getAllData())
          })
          .fontColor(Color.White)
          .backgroundColor(Color.Blue)
          .margin({ top: 20, bottom: 20 })
      }
    }
  }
}

页面代码如下:

import { AddIntentionDialog } from '../view/CustomDialog'
import { Intention } from '../model/Intention'
import { IntentionDataSource } from '../model/IntentionDataSource'

@Entry
@Component
struct Index {
  private dialogController: CustomDialogController
  private intentionList = new Array<Intention>()
  private intentionIndex: number = 0;

  build() {
    Column() {
      Button('添加数据&显示弹窗')
        .onClick(() => {
          for (let index = this.intentionIndex; index <  this.intentionIndex + 4; index++) {
            let intention: Intention = new Intention(`任务${index}`)
            this.intentionList.push(intention)
            console.info(`任务${index},列表大小:${this.intentionList.length}`)
          }
          this.intentionIndex =  this.intentionIndex + 4
          // 显示弹窗
          this.show()
        })
        .width('100%')
        .margin({ top: 10 })
      Button('显示弹窗')
        .onClick(() => {
          // 显示弹窗
          this.show()
        })
        .width('100%')
        .margin({ top: 10 })
    }.width('100%')
  }

  // 显示弹窗
  show() {
    let intentionListDataSource: IntentionDataSource = new IntentionDataSource()
    intentionListDataSource.pushDataArray(this.intentionList)
    this.dialogController = new CustomDialogController({
      builder: AddIntentionDialog({
        intentionListDataSource: intentionListDataSource,
        cancel: () => {
          console.info('点击取消按钮')
        },
        confirm: (intentions) => {
          console.info('点击确认按钮')
          this.intentionList = intentions
        },
      }),
      // 点击其他空白区域自动关闭弹窗
      autoCancel: true,
      // 弹窗的位置
      alignment: DialogAlignment.Center,
    })
    this.dialogController.open()
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1431084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024美赛C题完整解题教程及代码 网球运动的势头

2024 MCM Problem C: Momentum in Tennis &#xff08;网球运动的势头&#xff09; 注&#xff1a;在网球运动中&#xff0c;"势头"通常指的是比赛中因一系列事件&#xff08;如连续得分&#xff09;而形成的动力或趋势&#xff0c;这可能对比赛结果产生重要影响。球…

【Unity知识点详解】自定义程序集

今天来介绍一下Unity中的自定义程序集。在项目开发中我们经常接触到第三方插件的程序集&#xff0c;如DOTween、Newtonsoft.Json等。 使用自定义程序集有这么几个好处&#xff1a; 方便代码的的复用。当某一功能模块需要在多个项目中重复使用时&#xff0c;可以将代码编译成程…

canvas设置图形各种混合模式,类似photoshop效果

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

树莓派zero/zero w的区别

直观区别 1、zero没有WiFi和蓝牙模块&#xff0c;当然也没有网线接口&#xff0c;适合不需要网络的场景需求。 2、zero w带有WiFi和蓝牙模块&#xff0c;没有网线接口。适合需要网络的场景需求。 选购建议 我一般都是看有没有网络接口或者WiFi支持&#xff08;一定要选择焊接…

未来电话呼叫技术的社会影响与发展趋势----云微呼

未来电话呼叫技术将以更为智能化、便捷化和个性化为主要发展趋势&#xff0c;其所带来的社会影响也将是多层面的。以下将探讨未来电话呼叫技术可能的发展趋势以及对社会的影响&#xff1a; 智能化助力生活便捷&#xff1a; 未来电话呼叫技术将更加智能化&#xff0c;通过人工智…

《计算机网络简易速速上手小册》第10章:未来网络技术趋势(2024 最新版)

文章目录 10.1 边缘计算与网络设计 - 未来网络的速度与激情10.1.1 基础知识10.1.2 重点案例&#xff1a;使用 Python 实现边缘计算的实时视频分析准备工作Python 脚本示例 10.1.3 拓展案例1&#xff1a;智能交通系统Python 脚本示例 - 边缘计算设备上的交通流量分析 10.1.4 拓展…

牛客网 OR76 两个整数二进制位不同个数

前提需备知识&#xff1a; 算法&#xff1a;n&&#xff08;n-1&#xff09;是用来求n中1的个数 常用代码形式为&#xff1a; while(n){count;nn&(n-1); //每次减去1的个数} 关于该算法的推导可以见http://t.csdnimg.cn/Tld2S&#xff0c;本文就不再赘述 思路&…

三种pdf转ppt方法?学会这几招轻松搞定转换

三种pdf转ppt方法&#xff1f;在当今的工作和生活中&#xff0c;PDF和PPT这两种文件格式常常会让我们感到困扰。有时候我们需要将PDF文件转换成PPT格式&#xff0c;以便更好地进行演示或工作汇报。但是&#xff0c;如何快速、准确地完成这项任务呢&#xff1f;本文将为你揭秘三…

4.java中的输入输出/输入中的next和nextLine区别问题

&#xff08;笔试会经常让我们自己去处理输入输出&#xff09; 一.输出到控制台 println 输出的内容自带 \n&#xff08;换行&#xff09; print 不带 \n printf 的格式化输出方式和 C 语言的 printf 是基本一致的. String msg "Hello, World!";System.out.print(m…

非常好看的CSS加载中特效,引用css文件既可用

非常好看的CSS加载中特效 demo效果源码&#xff1a; <!DOCTYPE html5> <head><link rel"stylesheet" type"text/css" href"demo.css"/><link rel"stylesheet" type"text/css" href"loaders.css&…

C语言内存分配函数知识汇总

C语言中的主要内存分配函数包括&#xff1a; 1. malloc() - 函数原型&#xff1a;void *malloc(size_t size) - 功能&#xff1a;动态分配指定大小&#xff08;以字节为单位&#xff09;的连续内存空间。 - 返回值&#xff1a;成功分配内存时&#xff0c;返回指向该内存区域…

力扣热门100题刷题笔记 - 3.无重复字符的最长子串

力扣热门100题 - 3.无重复字符的最长子串 题目链接&#xff1a;3. 无重复字符的最长子串 题目描述&#xff1a; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。示例&#xff1a; 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字…

全球降水数据产品介绍

一、数据基本概况 降水数据在气象学、水文学、农业、生态学等领域有着广泛的用途。以下是一些降水数据的主要用途&#xff1a; 气象预报和监测&#xff1a; 降水数据是气象预报的重要组成部分&#xff0c;对预测天气、气候和自然灾害&#xff08;如暴雨、洪水&#xff09;至关…

Python学习从0到1 day13 Python数据容器.4.set集合、dict字典,映射

他往黑夜里去了&#xff0c;我陪他 ——24.2.4 一、set集合 1.为什么使用集合&#xff1f; 通过特性来分析&#xff1a; 列表可修改、支持重复元素且有序 元组、字符串不可修改、支持重复元素且有序 局限在于&#xff1a;它们都支持重复元素 当场景需要对内容进行去重处理&am…

微分几何——梅向明第四版学习笔记(一) 向量函数和曲线论

目录 引出向量函数曲线论简单曲线定义曲线的向量参数表示 曲线的切线【重要】曲线的法面【重要】曲线的自然参数表示 空间曲线曲线的密切平面空间曲线的基本三棱形【重要】单位切向量主法向量副法向量Frenet标架螺旋线的案例 曲线的曲率和曲率半径曲率的几何意义 曲线的挠率挠率…

政安晨:示例演绎Python的函数与获取帮助的方法

调用函数和定义我们自己的函数&#xff0c;并使用Python内置的文档&#xff0c;是成为一位Pythoner的开始。 通过我的上篇文章&#xff0c;相信您已经看过并使用了print和abs等函数。但是Python还有许多其他函数&#xff0c;并且定义自己的函数是Python编程的重要部分。 在本…

2024年美赛数学建模E题思路分析 - 财产保险的可持续性

# 1 赛题 问题E&#xff1a;财产保险的可持续性 极端天气事件正成为财产所有者和保险公司面临的危机。“近年来&#xff0c;世界已经遭受了1000多起极端天气事件造成的超过1万亿美元的损失”。[1]2022年&#xff0c;保险业的自然灾害索赔人数“比30年的平均水平增加了115%”。…

【lesson36】缓冲区的认识

文章目录 缓冲区的认识 缓冲区的认识 上次我们已经介绍了缓冲区的刷新策略&#xff0c;并且遇到了一个问题&#xff0c;这次我们就继续延续上次的话题。 一般而言行缓冲的设备文件-------显示器文件 一般而言全缓冲的设备文件-------磁盘文件 所有设备永远倾向于全缓冲&#…

git常用一些操作

1. git status // 查看当前目录更新 2. git checkout -b <NEW_BRANCH> // 新切一个分支&#xff08;只在第一次操作的时候做&#xff0c;后面就不用做了&#xff09; 3. git pull origin <BRANCH_NAME> …

JSR303参数校验-SpringMVC

文章目录 JSR303技术标准简介JSR303标准几个具体实现框架validation-apijakarta.validation-apihibernate-validatorspring-boot-starter-validation Spring Validationjavax.validation.constraints包下提供的注解org.hibernate.validator.constraints包扩展的注解校验注解默认…