2025-06-05 14:10:30 +08:00

122 lines
2.9 KiB
Plaintext

import { BasicConstant } from '../constants/BasicConstant'
export class HdListController {
loaded: () => void = () => {
}
finished: () => void = () => {
}
refreshed: () => void = () => {
}
reload: () => void = () => {
}
}
@Component
export struct HdList {
@State
refreshing: boolean = false
@State
finished: boolean = false
@State
loading: boolean = false
// options
lw: number = 0
@Builder
defaultListContent() {
}
@BuilderParam
listContent: () => void = this.defaultListContent
// function
onLoad: () => void = () => {
}
onRefresh: () => void = () => {
}
// controller
controller: HdListController = new HdListController()
scroller: Scroller = new Scroller()
aboutToAppear() {
if (this.controller) {
this.controller.loaded = () => this.loading = false
this.controller.finished = () => this.finished = true
this.controller.refreshed = () => this.refreshing = false
this.controller.reload = () => {
this.finished = false
this.refreshing = true
}
}
}
@Builder
loadMoreBuilder() {
ListItem() {
if (this.finished) {
Row() {
Text($r('app.string.hd_list_finished'))
.fontColor(Color.Gray)
.fontSize($r('app.float.hd_list_load_font'))
}
.height($r('app.float.hd_list_load_height'))
.width('100%')
.justifyContent(FlexAlign.Center)
} else if (this.loading && !this.finished) {
Row() {
LoadingProgress()
.width($r('app.float.hd_list_load_icon'))
Text($r('app.string.hd_list_loading'))
.fontColor(Color.Gray)
.fontSize($r('app.float.hd_list_load_font'))
}
.height($r('app.float.hd_list_load_height'))
.width('100%')
.justifyContent(FlexAlign.Center)
}
}
.height($r('app.float.hd_list_load_height'))
}
build() {
Refresh({ refreshing: $$this.refreshing }) {
List({ scroller: this.scroller }) {
this.listContent()
this.loadMoreBuilder()
}
.width('100%')
.height('100%')
.padding({ left: BasicConstant.SPACE_LG, right: BasicConstant.SPACE_LG })
// .divider({
// strokeWidth: $r('app.float.common_border_width'),
// color: $r('app.color.common_gray_border')
// })
.onReachEnd(() => {
if (this.loading || this.refreshing || this.finished) {
return;
}
this.loading = true
this.onLoad()
})
.scrollBar(BarState.Off)
.nestedScroll({
scrollForward: NestedScrollMode.PARENT_FIRST,
scrollBackward: NestedScrollMode.SELF_FIRST
})
.edgeEffect(EdgeEffect.None)
}
.width('100%')
.height('100%')
.layoutWeight(this.lw)
.onRefreshing(() => {
if (this.loading) {
return;
}
this.finished = false
this.onRefresh()
// tip: must next tick
})
}
}