鸿蒙应用开发-仿微信消息对话列表

功能介绍:

仿微信消息对话列表,显示发送文本和接收文本,参考文档创建列表。

知识点:

  1. 熟悉对List控件的使用。
  2. 熟悉对Text控制定义,如修改边框等。
  3. 手动控制列表的跳转。
  4. 动态添加列表数据。
  5. 使用构造函数初始化数据。

使用环境:

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

所需权限:

  1. 无需权限

效果图:

在这里插入图片描述

src/main/ets/model/Msg.ets中,定义消息的结构:

// 消息类型,分别是发送和接收
export const TYPE_RECEIVED = 0;
export const TYPE_SENT = 1;export class Msg {content: string;type: number;constructor(content: string, type: number) {this.content = content;this.type = type;}
}

src/main/ets/model/MsgDataSource.ets编写的是对列表的操作,如添加数据、获取列表大小,通过操作这个对象,控制列表显示。

import { Msg } from './Msg';export class MsgDataSource implements IDataSource {private listeners: DataChangeListener[] = [];private listData = new Array<Msg>();constructor() {this.addData(new Msg('你好,你叫什么名字', 0))this.addData(new Msg('主人你好,我是你的AI助手', 1))this.addData(new Msg('今天天气怎么样', 0))this.addData(new Msg('今天天气晴朗', 1))}public totalCount(): number {return this.listData.length;}public getData(index: number): Msg {return this.listData[index];}public addData(msg: Msg): void {// this.listData.push()this.listData = this.listData.concat(msg);this.notifyDataAdd(this.listData.length - 1);}registerDataChangeListener(listener: DataChangeListener): void {if (this.listeners.indexOf(listener) < 0) {this.listeners.push(listener);}}unregisterDataChangeListener(listener: DataChangeListener): void {const position = this.listeners.indexOf(listener);if (position >= 0) {this.listeners.splice(position, 1);}}notifyDataAdd(index: number): void {this.listeners.forEach((listener: DataChangeListener) => {listener.onDataAdd(index);})}notifyDataChange(index: number): void {this.listeners.forEach((listener: DataChangeListener) => {listener.onDataChange(index);})}
}

页面代码:

import { Msg, TYPE_SENT } from '../model/Msg';
import { MsgDataSource } from '../model/MsgDataSource';@Entry
@Component
struct Index {@Provide msgListData: MsgDataSource = new MsgDataSource();private listScroller: Scroller = new Scroller();build() {Column() {Scroll() {Column() {Row() {List({ space: 16, scroller: this.listScroller }) {LazyForEach(this.msgListData, (item: Msg) => {ListItem() {Column() {if (item?.type == TYPE_SENT) {Column() {Text(item?.content).border({ width: 1, color: Color.Black, radius: 10 }).padding(10).backgroundColor(Color.Yellow)}.width('100%').alignItems(HorizontalAlign.Start)} else {Column() {Text(item?.content).border({ width: 1, color: Color.Black, radius: 10 }).padding(10).backgroundColor(Color.Pink)}.width('100%').alignItems(HorizontalAlign.End)}}.width('100%')}})}.width('95%').height('100%')}.justifyContent(FlexAlign.Center).alignItems(VerticalAlign.Top).padding({ top: 10, bottom: 10 }).width('100%').height('100%')}.width('100%')}.scrollBar(BarState.Off).width('100%').height('90%')Row() {Button('添加数据').width('100%').margin({ bottom: 10 }).onClick(() => {let myDate: Date = new Date()let content = `现在是:${myDate.getHours()}${myDate.getMinutes()}${myDate.getSeconds()}`this.msgListData.addData(new Msg('现在几点了?', 0))this.msgListData.addData(new Msg(content, 1))this.listScroller.scrollToIndex(this.msgListData.totalCount() - 1)})}.height('10%').width('100%').alignItems(VerticalAlign.Bottom)}.width('100%').height('100%')}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql常见的需求,对于关键字的使用

如何使用MySQL将列数据转化为逗号分隔的形式。我们可以使用内置函数GROUP_CONCAT()来实现这个功能 如何使用MySQL将列数据转化为逗号分隔的形式。我们可以使用内置函数GROUP_CONCAT()来实现这个功能&#xff0c;也可以根据实际需求自定义一个函数。这种技术在一些需要对数据进…

【翻译】在Qt Designer中创建主窗口(Main Windows)

原文地址&#xff1a;https://doc.qt.io/qt-6/designer-creating-mainwindows.html Qt Designer 可用于为不同用途创建用户界面&#xff0c;并为每个用户界面提供不同类型的模板。主窗口模板用于创建具有菜单栏、工具栏和停靠窗口部件的应用程序窗口。 通过打开文件菜单并选择…

【新】Unity Meta Quest MR 开发(一):Passthrough 透视配置

文章目录 &#x1f4d5;教程说明&#x1f4d5;配置透视的串流调试功能&#x1f4d5;第一步&#xff1a;设置 OVRManager&#x1f4d5;第二步&#xff1a;添加 OVRPassthroughLayer 脚本&#x1f4d5;第三步&#xff1a;在场景中添加虚拟物体&#x1f4d5;第四步&#xff1a;设置…

DETR 个人理解

DETR 个人理解 目录 DETR 个人理解 概念说明 transformer网络结构 整体流程 损失计算 整体理解 结果说明 论文 代码 参考链接 个人拙见&#xff0c;仅供参考&#xff0c;欢迎指正交流 这篇论文还是挺重要的&#xff0c;因为是transforms用于目标检测的第一篇论文&am…

【征服redis2】redis的事务介绍

目录 目录 1.redis事务介绍 2 事务出错的处理 3.Java如何使用redis事务 1.redis事务介绍 在前面我们介绍了redis的几种典型数据结构和应用&#xff0c;本文我们来看一下redis的事务问题。事务也是数据库的重要主题&#xff0c;熟悉关系型数据库的读者应该对事务比较了解&a…

openGauss学习笔记-202 openGauss 数据库运维-常见故障定位案例-不同用户查询同表显示数据不同

文章目录 openGauss学习笔记-202 openGauss 数据库运维-常见故障定位案例-不同用户查询同表显示数据不同202.1 不同用户查询同表显示数据不同202.1.1 问题现象202.1.2 原因分析202.1.3 处理办法 openGauss学习笔记-202 openGauss 数据库运维-常见故障定位案例-不同用户查询同表…

FPGA之分布RAM(1)

SLICEM 资源可以实现分布式 RAM。可以实现的 RAM 类型&#xff1a; 单口 RAM 双端口 简单的双端口 四端口 下表给出了通过1SLICEM中的4个LUT可以实现的RAM类型 1.32 X2 Quad Port Distributed RAM 我们介绍过把 6 输入 LUT 当作 2 个 5输入 LUT 使用&#xff0c;在这里&a…

【蓝桥杯EDA设计与开发】资料汇总以及立创EDA及PCB相关技术资料汇总(持续更新)

[18/01/2024]&#xff1a;目前为了准备蓝桥杯做一些资料贴&#xff0c;于是写下这一篇博客。 各种资料均来源于网络以及部分书籍、手册等文档&#xff0c;参考不保证其准确性。 如果在准备蓝桥杯&#xff0c;可与我私信共同学习&#xff01;&#xff01;&#xff01;&#xf…

每日OJ题_算法_滑动窗口⑤_力扣904水果成篮

目录 力扣904. 水果成篮 解析及代码1&#xff08;使用容器&#xff09; 解析及代码2&#xff08;开数组&#xff09; 力扣904. 水果成篮 904. 水果成篮 - 力扣&#xff08;LeetCode&#xff09; 难度 中等 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这…

Next.js 开发指​南(GitHub 115k star​)

Next.js 是一个构建于 Node.js 之上的开源 Web 开发框架&#xff0c;它扩展了最新的 React 特性&#xff0c;集成了基于 Rust 的 JavaScript 工具&#xff0c;可以帮助你快速创建全栈 Web 应用 &#xff08;full-stack Web applications&#xff09; 。 对于有一定 React 基础…

Kubernetes部署ingress

文章目录 环境部署ingress可以访问 registry.k8s.io 的环境不能访问 registry.k8s.io 的环境手工部署总结 测试ingress参考 环境 RHEL 9.3Docker Community 24.0.7minikube v1.32.0 部署ingress 可以访问 registry.k8s.io 的环境 通过minikube启用 ingress &#xff1a; m…

【前沿技术杂谈:智能对话的未来】深入比较ChatGPT与文心一言

【前沿技术杂谈&#xff1a;智能对话的未来】深入比较ChatGPT与文心一言 引言主体智能回复语言准确性知识库丰富度 深入分析&#xff1a;ChatGPT与文心一言的技术对比技术架构和算法数据处理和隐私用户界面和体验 应用场景分析未来展望技术进步的趋势潜在的挑战对社会的影响 结…