HarmonyOS 鸿蒙Next 实现聊天页List子组件自下而上排列

发布于 1周前 作者 phonegap100 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 实现聊天页List子组件自下而上排列

一、内容反向排列(自下而上)

为了使List组件能够自上而下排列,且不改变数据的排列方向,我们可以使用 rotate 属性将外层容器整体旋转180°,再将子组件也旋转180°,即可实现反向排列的效果。

List(){
LazyForEach(this.messageSource, (data: V2NIMMessage, index)=>{
ListItem(){
MessageItem({
messageData: data,
upData: this.messageSource.getData(index>=this.messageSource.totalCount()-1?index:index+1)
})
}.rotate({angle: 180})
}, (data: V2NIMMessage)=>{ return JSON.stringify(data) })
}.height(this.listHeight)
.width(“100%”)
.rotate({angle: 180})

二、反向排列后List组件无法在没撑满的情况靠上对齐

在我们对List组件做了反转之后,默认情况下List组件是相对于屏幕下方进行布局的;但是很多情况下,比如微信登聊天页面,需要在未撑满list组件时,子组件向上对齐;对于这种情况,得出如下的解决方案。

实现这个效果,需要动态计算绘制区域的高度。

  1. display.getDefaultDisplaySync().height 拿到屏幕高度
let windowHeight: number = px2vp(display.getDefaultDisplaySync().height);
  1. 计算顶部高度 headHeight
let headHeight: number = 45 + WindowBar.getWindowBar().topHeight;
  1. 计算底部高度 bottomHeight
let bottomHeight: number = WindowBar.getWindowBar().bottomHeight + 10 + 30
  1. 计算画布高度 chatHeight
let chatHeight: number = windowHeight - headHeight - bottomHeight;

通过上方4步能够拿到当前画布的高度,然后我们需要计算出组件当前高度

  1. 通过组件的 onAreaChange 事件,可以拿到属性重新绘制后的高度
  2. 通过 Map 来根据每个子组件的唯一值来存储每个组件的高度
@State private newListHeight: Map<string, number> = new Map();

ListItem(){ … }.rotate({angle: 180}) .onAreaChange((oldValue: Area, newValue: Area)=>{ this.newListHeight.set(data.messageServerId, newValue.height as number); if ((index === this.messageSource.totalCount() || index > 25) && index <= 25) { this.getHeight() } })

  1. 遍历map,拿到组件总高度,初始的20是list组件开头和结尾的边距
let componentHeight: number = 20;
this.newListHeight.forEach((value)=>{
componentHeight += value;
})
  1. 这时候我们就可以判断组件高度和画布高度的大小,从而选择使用哪个高度来绘制画布高度了
animateTo({duration: isAnimateTo?200:0},()=>{
this.listHeight = chatHeight > componentHeight ? componentHeight : chatHeight;
})

7 回复

List(){
  LazyForEach(this.messageSource, (data: V2NIMMessage, index)=>{
    ListItem(){
      MessageItem({
        messageData: data,
        upData: this.messageSource.getData(index>=this.messageSource.totalCount()-1?index:index+1)
      })
    }.rotate({angle: 180})
  }, (data: V2NIMMessage)=>{ return JSON.stringify(data) })
}.height(this.listHeight)
.width(“100%”)
.rotate({angle: 180})

微信明天能上吗

不知道🤷,这是自己仿微信写的demo😂

害  着急死了 😂😂😂

我也想微信感觉下来😂,不想带备用机了。

大佬,求示例源码,感谢~

在HarmonyOS鸿蒙系统中,针对Next聊天页List子组件自下而上的排列需求,这通常涉及到列表组件的自定义布局和排序逻辑。以下是一些可能的实现方式:

  1. 自定义布局:在XML布局文件中,可以通过设置ListContainer或类似容器的布局属性来控制子组件的排列方式。尽管默认情况下列表通常是自上而下排列,但你可以通过调整子组件的添加顺序和容器的布局逻辑来实现自下而上的效果。

  2. 数据排序:在Java或JavaScript代码中,确保你向列表提供的数据是按照自下而上的顺序排列的。这通常意味着在添加数据到列表之前,你需要对数据进行逆序排序。

  3. 滚动行为:如果列表需要支持滚动,确保滚动行为符合自下而上的阅读习惯。这可能涉及到调整滚动容器的初始滚动位置或监听滚动事件来动态调整内容。

  4. 动画效果:为了增强用户体验,可以考虑在列表项加载或滚动时添加适当的动画效果,以突出自下而上的排列方式。

如果上述方法未能满足你的需求或问题依旧没法解决,请联系官网客服。官网地址是:https://www.itying.com/category-93-b0.html

回到顶部