HarmonyOS 鸿蒙Next waterFlow无法像GridItem设置item占一行

发布于 1周前 作者 sinazl 来自 鸿蒙OS

HarmonyOS 鸿蒙Next waterFlow无法像GridItem设置item占一行

想要将某个item设置占一行跟着waterFlow一起滑动。 实现了类似截图的功能,但是我想要banner栏跟着waterFlow一起滑动,在Grid中,GridItem可以设置item单独占一行,但是flowItem不行。

2 回复
深色代码主题
复制
import {WaterFlowDataSource} from './WaterFlowDataSource'
@Entry
@Component
struct WaterFlowDemo {
  @State minSize: number = 80
  @State maxSize: number = 180
  @State fontSize: number = 24
  @State colors: number[] = [0xFFC0CB, 0xDA70D6, 0x6B8E23, 0x6A5ACD, 0x00FFFF, 0x00FF7F]
  scroller: Scroller = new Scroller()
  datasource: WaterFlowDataSource = new WaterFlowDataSource()
  private itemWidthArray: number[] = []
  private itemHeightArray: number[] = []

// 计算flow item宽/高 getSize() { let ret = Math.floor(Math.random() * this.maxSize) return (ret > this.minSize ? ret : this.minSize) }

// 保存flow item宽/高 getItemSizeArray() { for (let i = 0; i < 1000; i++) { this.itemWidthArray.push(this.getSize()) this.itemHeightArray.push(this.getSize()) } }

aboutToAppear() { this.getItemSizeArray() }

@Builder itemFoot() { Column() { Text(Footer) .fontSize(10) .backgroundColor(Color.Red) .width(50) .height(50) .align(Alignment.Center) .margin({ top: 2 }) } } build() { Column({ space: 2 }) { WaterFlow() { LazyForEach(this.datasource, (item: number, index: number) => { FlowItem() { Column() { if(this.itemWidthArray[index] > 100){ Grid() { GridItem() { Text(“N” + item) .fontSize(16) .width(‘100%’) .height(‘100%’) .textAlign(TextAlign.Center) }.columnStart(1).columnEnd(2) } }else{ Grid() { GridItem() { Text(“N” + item) .fontSize(16) .width(‘100%’) .height(‘100%’) .textAlign(TextAlign.Center) .borderStyle(BorderStyle.Dashed).borderWidth(5).borderColor(Color.Red).borderRadius(10) } GridItem() { Text(“N1” + item) .fontSize(16) .width(‘100%’) .height(‘100%’) .textAlign(TextAlign.Center) .borderStyle(BorderStyle.Dashed).borderWidth(5).borderColor(Color.Green).borderRadius(10) } } .columnsTemplate(‘1fr 1fr’) } } } .onAppear(() => { // 即将触底时提前增加数据 if (item + 20 == this.datasource.totalCount()) { for (let i = 0; i < 100; i++) { this.datasource.AddLastItem() } } }) .width(‘100%’) .height(this.itemHeightArray[item % 100]) .backgroundColor(this.colors[item % 5]) }, (item: string) => item) } .columnsTemplate(“1fr”) .columnsGap(10) .rowsGap(5) .backgroundColor(0xFAEEE0) .width(‘100%’) .height(‘100%’) } } } export class WaterFlowDataSource implements IDataSource { private dataArray: number[] = [] private listeners: DataChangeListener[] = []

constructor() { for (let i = 0; i < 1000; i++) { this.dataArray.push(i) } }

// 获取索引对应的数据 public getData(index: number): number { return this.dataArray[index] }

// 通知控制器数据重新加载 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) }) }

// 通知控制器数据位置变化 notifyDataMove(from: number, to: number): void { this.listeners.forEach(listener => { listener.onDataMove(from, to) }) }

// 获取数据总数 public totalCount(): number { return this.dataArray.length }

// 注册改变数据的控制器 registerDataChangeListener(listener: DataChangeListener): void { if (this.listeners.indexOf(listener) < 0) { this.listeners.push(listener) } }

// 注销改变数据的控制器 unregisterDataChangeListener(listener: DataChangeListener): void { const pos = this.listeners.indexOf(listener) if (pos >= 0) { this.listeners.splice(pos, 1) } }

// 增加数据 public Add1stItem(): void { this.dataArray.splice(0, 0, this.dataArray.length) this.notifyDataAdd(0) }

// 在数据尾部增加一个元素 public AddLastItem(): void { this.dataArray.splice(this.dataArray.length, 0, this.dataArray.length) this.notifyDataAdd(this.dataArray.length - 1) }

// 在指定索引位置增加一个元素 public AddItem(index: number): void { this.dataArray.splice(index, 0, this.dataArray.length) this.notifyDataAdd(index) }

// 删除第一个元素 public Delete1stItem(): void { this.dataArray.splice(0, 1) this.notifyDataDelete(0) }

// 删除第二个元素 public Delete2ndItem(): void { this.dataArray.splice(1, 1) this.notifyDataDelete(1) }

// 删除最后一个元素 public DeleteLastItem(): void { this.dataArray.splice(-1, 1) this.notifyDataDelete(this.dataArray.length) }

// 重新加载数据 public Reload(): void { this.dataArray.splice(1, 1) this.dataArray.splice(3, 2) this.notifyDataReload() } }

更多关于HarmonyOS 鸿蒙Next waterFlow无法像GridItem设置item占一行的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙系统中,Next waterFlow 布局与 GridItem 布局在行为上存在差异。GridItem 可以通过设置属性确保每个item占据一行,但Next waterFlow 的设计初衷是实现灵活的流式布局,其中items会根据容器大小和item本身的尺寸自动换行排列。

若希望在 Next waterFlow 中模拟 GridItem 的单行占据行为,可以尝试以下方法:

  1. 设置Item宽度:确保每个item的宽度与 Next waterFlow 容器的宽度相匹配,这样每个item就会因宽度占满而自动换行。可以通过设置item的 width 属性为 match_parent 或具体数值(与容器宽度一致)来实现。

  2. 调整间距:检查并调整item之间的水平和垂直间距,确保它们不会干扰单行布局的效果。

  3. 容器高度:根据item的数量和内容动态调整容器的高度,确保内容不会溢出。

请注意,由于 Next waterFlow 的流式布局特性,完全模拟 GridItem 的单行行为可能受限。如果上述方法无法满足需求,可能需考虑使用其他布局方式或自定义布局逻辑。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部