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

功能介绍:

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

知识点:

  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%')
  }
}
### 鸿蒙系统开发微信首页功能的实现方式 #### 底部导航栏的设计与实现 在鸿蒙系统的应用开发中,底部导航栏是一个常见的需求。可以通过自定义组件来构建 `BottomNavigation` 功能模块[^1]。具体来说,开发者可以选择手动编写代码或者利用 HarmonyOS 提供的标准控件库中的预设组件。 以下是基于 HarmonyOS 的一种简单实现方案: ```java // 定义 BottomNavigationItem 组件列表 List<BottomNavigationItem> items = new ArrayList<>(); items.add(new BottomNavigationItem(R.drawable.ic_home, "Home")); items.add(new BottomNavigationItem(R.drawable.ic_search, "Search")); items.add(new BottomNavigationItem(R.drawable.ic_profile, "Profile")); // 初始化 BottomNavigation 控件并绑定数据 BottomNavigation bottomNavigation = (BottomNavigation) findViewById(R.id.bottom_navigation); bottomNavigation.setItems(items); // 设置点击事件监听器 bottomNavigation.setOnItemSelectedListener(position -> { switch (position) { case 0: loadFragment(HomeFragment.newInstance()); break; case 1: loadFragment(SearchFragment.newInstance()); break; case 2: loadFragment(ProfileFragment.newInstance()); break; } }); ``` 此代码片段展示了如何创建一个带有三个选项卡的底部导航栏,并为其设置相应的点击行为逻辑。 #### 页面布局结构 对于类似于微信这样的社交类 App 来说,其首页通常由以下几个部分组成: - **顶部状态栏**:显示网络连接情况、时间以及电池电量等信息- **聊天消息区域**:展示好友之间的对话记录摘要; - **动态更新区**:呈现朋友圈最新发布的内容概览; 这些 UI 元素都可以通过 XML 布局文件配合 Java/Kotlin 编程语言完成定制化配置[^2]。 #### 数据交互处理机制 为了使应用程序能够高效地加载和渲染大量数据项,在实际编码过程中还需要考虑优化措施比如分页加载技术或是虚拟视图回收池策略等等。此外还需注意跨线程操作的安全性问题以免引发 ANR(Application Not Responding) 错误现象发生。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜雨飘零1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值