

如下示例代码实现瀑布流的无限滚动会出现滑动至底部停顿加载的现象。
class WaterFlowDataSource implements IDataSource {
private dataArray: number[] = []
private listeners: DataChangeListener[] = []
constructor() {
for (let i = 0; i < 100; 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 addNewItems(count: number): void {
let len = this.dataArray.length;
for (let i = 0; i < count; i++) {
this.dataArray.push(this.dataArray.length);
}
this.listeners.forEach(listener => {
listener.onDatasetChange([{ type: DataOperationType.ADD, index: len, count: count }]);
})
}
}
@Reusable
@Component
struct ReusableFlowItem {
@State item: number = 0;
build() {
Text(this.item + 1 + '')
.fontWeight(FontWeight.Regular)
.fontSize(20)
.fontColor(Color.Black)
}
}
@Entry
@Component
export struct WaterFlowPage {
private dataSource: WaterFlowDataSource = new WaterFlowDataSource();
scroller: Scroller = new Scroller();
@Builder
itemFoot() {
Row() {
LoadingProgress()
.color(Color.Blue).height(50).aspectRatio(1).width('20%')
Text(`正在加载`)
.fontSize(20)
.width('30%')
.height(50)
.align(Alignment.Center)
.margin({ top: 2 })
}.width('100%').justifyContent(FlexAlign.Center)
}
build() {
Column({ space: 2 }) {
WaterFlow({ footer: this.itemFoot(), layoutMode: WaterFlowLayoutMode.SLIDING_WINDOW }) {
LazyForEach(this.dataSource, (item: number) => {
FlowItem() {
ReusableFlowItem({ item: item })
}
.width('100%')
.height(200)
.border({
width: 1,
color: Color.Black
})
}, (item: string) => item)
}
.columnsTemplate('1fr '.repeat(3))
.backgroundColor(Color.White)
.width('100%')
.height('100%')
.layoutWeight(1)
// 触底加载数据
.onReachEnd(() => {
setTimeout(() => {
this.dataSource.addNewItems(100);
}, 500);
})
}
}
}