120 lines
2.9 KiB
Plaintext
120 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
|
|
})
|
|
}
|
|
}
|