前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >鸿蒙应用开发-仿微信聊天对话对话信息列表

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

作者头像
夜雨飘零
发布2024-05-26 16:10:37
380
发布2024-05-26 16:10:37
举报
文章被收录于专栏:CSDN博客CSDN博客

功能介绍:

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

知识点:

  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中,定义消息的结构:

代码语言:javascript
复制
// 消息类型,分别是发送和接收
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编写的是对列表的操作,如添加数据、获取列表大小,通过操作这个对象,控制列表显示。

代码语言:javascript
复制
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);
    })
  }
}

页面代码:

代码语言:javascript
复制
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%')
  }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档