diff --git a/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-container-waterflow.md b/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-container-waterflow.md
index 72a56a92e0fd09b6d8bc36b5681cfaf81ab36df6..3550369224bbe0826eda3052a18e9515b103c814 100644
--- a/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-container-waterflow.md
+++ b/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-container-waterflow.md
@@ -44,7 +44,7 @@ WaterFlow(options?: WaterFlowOptions)
| 名称 | 类型 | 必填 | 说明 |
| ---------- | ----------------------------------------------- | ------ | -------------------------------------------- |
-| footer | [CustomBuilder](ts-types.md#custombuilder8) | 否 | 设置WaterFlow尾部组件。
**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
+| footer | [CustomBuilder](ts-types.md#custombuilder8) | 否 | 设置WaterFlow尾部组件。
**说明:**
使用方法参见[示例1](#示例1使用基本瀑布流)。
**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
| footerContent18+ | [ComponentContent](../js-apis-arkui-ComponentContent.md) | 否 | 设置WaterFlow尾部组件。
该参数的优先级高于参数footer,即同时设置footer和footerContent时,以footerContent设置的组件为准。
**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 |
| scroller | [Scroller](ts-container-scroll.md#scroller) | 否 | 可滚动组件的控制器,与可滚动组件绑定。
**说明:**
不允许和其他滚动类组件,如:[ArcList](ts-container-arclist.md)、[List](ts-container-list.md)、[Grid](ts-container-grid.md)、[Scroll](ts-container-scroll.md)和[WaterFlow](ts-container-waterflow.md)绑定同一个滚动控制对象。
**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
| sections12+ | [WaterFlowSections](#waterflowsections12) | 否 | 设置FlowItem分组,实现同一个瀑布流组件内部各分组使用不同列数混合布局。
**说明:**
1. 使用分组混合布局时会忽略columnsTemplate和rowsTemplate属性。
2. 使用分组混合布局时不支持单独设置footer,可以使用最后一个分组作为尾部组件。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 |
@@ -283,7 +283,7 @@ itemConstraintSize(value: ConstraintSizeOptions)
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ---------------------------------------------------------- | ---- | ---------- |
-| value | [ConstraintSizeOptions](ts-types.md#constraintsizeoptions) | 是 | 约束尺寸。设置小于0的值,参数不生效。
**说明:**
1.同时设置itemConstraintSize和FlowItem的[constraintSize](ts-universal-attributes-size.md#constraintsize)属性时,minWidth/minHeight会取其中的最大值,maxWidth/maxHeight会取其中的最小值,调整后的值作为FlowItem的constraintSize处理。2.只设置itemConstraintSize时,相当于对WaterFlow所有子组件设置了相同的constraintSize。3.itemConstraintSize通过以上两种方式转换成FlowItem的constraintSize后的生效规则与通用属性[constraintSize](./ts-universal-attributes-size.md#constraintsize)相同。|
+| value | [ConstraintSizeOptions](ts-types.md#constraintsizeoptions) | 是 | 约束尺寸。设置小于0的值,参数不生效。
**说明:**
1.同时设置itemConstraintSize和FlowItem的[constraintSize](ts-universal-attributes-size.md#constraintsize)属性时,minWidth/minHeight会取其中的最大值,maxWidth/maxHeight会取其中的最小值,调整后的值作为FlowItem的constraintSize处理。
2.只设置itemConstraintSize时,相当于对WaterFlow所有子组件设置了相同的constraintSize。
3.itemConstraintSize通过以上两种方式转换成FlowItem的constraintSize后的生效规则与通用属性[constraintSize](./ts-universal-attributes-size.md#constraintsize)相同。|
### columnsGap
@@ -643,6 +643,11 @@ export class WaterFlowDataSource implements IDataSource {
// Index.ets
import { WaterFlowDataSource } from './WaterFlowDataSource';
+enum FooterState {
+ Loading = 0,
+ End = 1
+}
+
@Entry
@Component
struct WaterFlowDemo {
@@ -650,6 +655,7 @@ struct WaterFlowDemo {
@State maxSize: number = 180;
@State fontSize: number = 24;
@State colors: number[] = [0xFFC0CB, 0xDA70D6, 0x6B8E23, 0x6A5ACD, 0x00FFFF, 0x00FF7F];
+ @State footerState: FooterState = FooterState.Loading;
scroller: Scroller = new Scroller();
dataSource: WaterFlowDataSource = new WaterFlowDataSource();
private itemWidthArray: number[] = [];
@@ -675,20 +681,39 @@ struct WaterFlowDemo {
@Builder
itemFoot() {
+ // 不要直接用IfElse节点作为footer的根节点。
Column() {
- Text(`Footer`)
- .fontSize(10)
- .backgroundColor(Color.Red)
- .width(50)
- .height(50)
- .align(Alignment.Center)
- .margin({ top: 2 })
+ if (this.footerState == FooterState.Loading) {
+ Text(`加载中...`)
+ .fontSize(10)
+ .backgroundColor(Color.Red)
+ .width(50)
+ .height(50)
+ .align(Alignment.Center)
+ .margin({ top: 2 })
+ } else if (this.footerState == FooterState.End) {
+ Text(`到底啦...`)
+ .fontSize(10)
+ .backgroundColor(Color.Red)
+ .width(50)
+ .height(50)
+ .align(Alignment.Center)
+ .margin({ top: 2 })
+ } else {
+ Text(`Footer`)
+ .fontSize(10)
+ .backgroundColor(Color.Red)
+ .width(50)
+ .height(50)
+ .align(Alignment.Center)
+ .margin({ top: 2 })
+ }
}
}
build() {
Column({ space: 2 }) {
- WaterFlow() {
+ WaterFlow({ footer: this.itemFoot() }) {
LazyForEach(this.dataSource, (item: number) => {
FlowItem() {
Column() {
@@ -700,14 +725,6 @@ struct WaterFlowDemo {
.layoutWeight(1)
}
}
- .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])
@@ -719,6 +736,19 @@ struct WaterFlowDemo {
.backgroundColor(0xFAEEE0)
.width('100%')
.height('100%')
+ // 触底加载数据
+ .onReachEnd(() => {
+ console.info("onReachEnd")
+ if (this.dataSource.totalCount() > 200) {
+ this.footerState = FooterState.End;
+ return;
+ }
+ setTimeout(() => {
+ for (let i = 0; i < 100; i++) {
+ this.dataSource.addLastItem();
+ }
+ }, 1000)
+ })
.onReachStart(() => {
console.info('waterFlow reach start');
})
@@ -830,11 +860,13 @@ struct ReusableFlowItem {
}
build() {
- Image('res/waterFlowTest(' + this.item % 5 + ').jpg')
- .overlay('N' + this.item, { align: Alignment.Top })
- .objectFit(ImageFit.Fill)
- .width('100%')
- .layoutWeight(1)
+ Column() {
+ Image('res/waterFlowTest(' + this.item % 5 + ').jpg')
+ .overlay('N' + this.item, { align: Alignment.Top })
+ .objectFit(ImageFit.Fill)
+ .width('100%')
+ .layoutWeight(1)
+ }
}
}
@@ -934,44 +966,33 @@ struct WaterFlowDemo {
Button('update')
.height('5%')
.onClick(() => {
- // 在第二个分组增加4个FlowItem,注意保证LazyForEach中数据数量和所有分组itemsCount的和保持一致
- let newSection: SectionOptions = {
- itemsCount: 6,
- crossCount: 3,
- columnsGap: 5,
- rowsGap: 10,
- margin: this.sectionMargin,
- onGetItemMainSizeByIndex: (index: number) => {
- return this.itemHeightArray[index % 100];
- }
- }
+ // 在第一个分组中增加4个FlowItem,注意保证LazyForEach中数据数量和所有分组itemsCount的和保持一致
+ const sections: Array = this.sections.values();
+ let newSection: SectionOptions = sections[0];
this.dataSource.addItem(this.oneColumnSection.itemsCount);
this.dataSource.addItem(this.oneColumnSection.itemsCount + 1);
this.dataSource.addItem(this.oneColumnSection.itemsCount + 2);
this.dataSource.addItem(this.oneColumnSection.itemsCount + 3);
- const result: boolean = this.sections.update(1, newSection);
+ newSection.itemsCount += 4;
+ const result: boolean = this.sections.update(0, newSection);
console.info('update:' + result);
})
.margin({ top: 10, left: 20 })
Button('delete')
.height('5%')
.onClick(() => {
- // 先点击update再点击delete
- let newSection: SectionOptions = {
- itemsCount: 2,
- crossCount: 2,
- columnsGap: 5,
- rowsGap: 10,
- margin: this.sectionMargin,
- onGetItemMainSizeByIndex: (index: number) => {
- return this.itemHeightArray[index % 100];
- }
+ // 在第一个分组中减少4个FlowItem,注意保证LazyForEach中数据数量和所有分组itemsCount的和保持一致
+ const sections: Array = this.sections.values();
+ let newSection: SectionOptions = sections[0];
+ if (newSection.itemsCount < 4) {
+ return;
}
- this.dataSource.deleteItem(this.oneColumnSection.itemsCount);
- this.dataSource.deleteItem(this.oneColumnSection.itemsCount);
- this.dataSource.deleteItem(this.oneColumnSection.itemsCount);
- this.dataSource.deleteItem(this.oneColumnSection.itemsCount);
- this.sections.update(1, newSection);
+ this.dataSource.deleteItem(this.oneColumnSection.itemsCount - 1);
+ this.dataSource.deleteItem(this.oneColumnSection.itemsCount - 2);
+ this.dataSource.deleteItem(this.oneColumnSection.itemsCount - 3);
+ this.dataSource.deleteItem(this.oneColumnSection.itemsCount - 4);
+ newSection.itemsCount -= 4;
+ this.sections.update(0, newSection);
})
.margin({ top: 10, left: 20 })
Button('values')
@@ -992,8 +1013,8 @@ struct WaterFlowDemo {
ReusableFlowItem({ item: item })
}
.width('100%')
- // 以onGetItemMainSizeByIndex为准
- // .height(this.itemHeightArray[item % 100])
+ // 同时设置onGetItemMainSizeByIndex和height属性时,主轴大小以onGetItemMainSizeByIndex返回结果为准
+ .height(this.itemHeightArray[item % 100])
.backgroundColor(this.colors[item % 5])
}, (item: string) => item)
}