HarmonyOS 鸿蒙Next懒加载的具体实践
HarmonyOS 鸿蒙Next懒加载的具体实践 我有一个页面,纵向布局,页面内容大致分为三个部分,从上到下分别为,
- 水平轮播图
- 水平轮播图
- 垂直可无限加载更多的list(首次请求时会获取到40张图片返回)
那么现在我需要在三个模块里面都应用上懒加载方式,目前我应该如何实现,以下是我的大致结构,但是会存在加载该页面的时候,模块3的懒加载无法生效,系统会默认把这40张图一次性全部加载了,我希望的是屏幕外的就不加载,按需加载,那么我应该如何实现
List(){
ListItem() {
// 模块1的轮播图懒加载
}
ListItem() {
// 模块2的轮播图懒加载
}
ListItem() {
// 模块3的轮播图懒加载
Column() {
Text('无限加载模块')
WaterFlow() {
LazyForEach()
...
}
}
}
一定要这种效果
更多关于HarmonyOS 鸿蒙Next懒加载的具体实践的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
arkts实现这个很简单。只需要在onScrollIndex事件更新list值就行了。往下拖的时候lastIndex<this.objArr.length进行数据请求就行。
.onScrollIndex((firstIndex: number, lastIndex: number)=>{
if(this.objArr.length>=20) {
if (lastIndex >= (this.objArr.length - 4)) {
if (this.navSelect == 1) {
if(this.taskLoad == true)
{
return;
}
this.taskCampListByProvince();
}
else if (this.navSelect == 2)
if(this.taskLoad == true)
{
return;
}
this.taskCampListByCity();
}
}
})
taskCampListByProvince() {
if(this.dataIsEnd)
return;
let params = "province=湖北省&&pageIndex="+this.pageIndex+"";
let tCamp = new taskCamp();
this.taskLoad = true;
tCamp.campListByProvince(params, (data: http.HttpResponse) => {
let resultObj = json.parse(data.result.toString()) as Array<object>;
if(resultObj.length == 0)
this.dataIsEnd = true;
resultObj.forEach(
(item)=>{
this.objArr.push(item);
}
)
this.pageIndex++;
this.taskLoad = false;
});
}
更多关于HarmonyOS 鸿蒙Next懒加载的具体实践的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
楼主你好,可以参考下面demo:
class MyDataSource implements IDataSource { private list: number[] = []
constructor(list: number[]) { this.list = list }
totalCount(): number { return this.list.length }
getData(index: number): number { return this.list[index] }
registerDataChangeListener(listener: DataChangeListener): void { }
unregisterDataChangeListener() { } }
@Entry @Component struct LazyForEachDemo { private list: MyDataSource2 = new MyDataSource2(); private swiperController: SwiperController = new SwiperController() private data: MyDataSource = new MyDataSource([])
@Builder itemHead(text: string) { Text(text) .fontSize(20) .backgroundColor(0xAABBCC) .width(‘100%’) .padding(10) }
@Builder itemFoot(num: number) { Text(‘共’ + num + ‘节课’) .fontSize(16) .backgroundColor(0xAABBCC) .width(‘100%’) .padding(5) }
aboutToAppear() {
for (let date = 1; date < ~~(Math.random() * 30) + 3; date++) {
let dayData = new dateListItem(date + ‘’);
for (let index = 1; index < ~~(Math.random() * 100) + 30; index++) {
dayData.orderList.pushData(hello${index}
);
}
this.list.pushData(dayData);
}
let list: number[] = []
for (let i = 1; i <= 10; i++) {
list.push(i);
}
this.data = new MyDataSource(list)
}
build() { Column() { Swiper(this.swiperController) { LazyForEach(this.data, (item: string) => { Text(item.toString()) .width(‘90%’) .height(160) .backgroundColor(0xAFEEEE) .textAlign(TextAlign.Center) .fontSize(30) }, (item: string) => item) } .displayCount(3, true) .autoPlay(true) .interval(4000) .loop(true) .duration(1000) .itemSpace(10) .indicator( // 设置圆点导航点样式 new DotIndicator() .itemWidth(15) .itemHeight(15) .selectedItemWidth(15) .selectedItemHeight(15) .color(Color.Gray) .selectedColor(Color.Blue)) .margin(5)
Swiper(this.swiperController) {
LazyForEach(this.data, (item: string) => {
Text(item.toString())
.width('90%')
.height(160)
.backgroundColor(0xAFEEEE)
.textAlign(TextAlign.Center)
.fontSize(30)
}, (item: string) => item)
}
.displayCount(3, true)
.autoPlay(true)
.interval(4000)
.loop(true)
.duration(1000)
.itemSpace(10)
.indicator( // 设置圆点导航点样式
new DotIndicator()
.itemWidth(15)
.itemHeight(15)
.selectedItemWidth(15)
.selectedItemHeight(15)
.color(Color.Gray)
.selectedColor(Color.Blue))
List({ space: 20 }) {
LazyForEach(this.list, (item: dateListItem) => {
ListItemGroup({ header: this.itemHead(item.date + ''), footer: this.itemFoot(item.orderList.totalCount()) }) {
LazyForEach(item.orderList, (order: string,) => {
ListItem() {
Text(order)
.width('100%')
.height(60)
.fontSize(20)
.textAlign(TextAlign.Center)
.backgroundColor(0xFFFFFF)
}
}, (item: string) => JSON.stringify(item))
}
.divider({ strokeWidth: 1, color: Color.Blue })
})
}
.height('100%')
.cachedCount(1)
.width('90%')
.sticky(StickyStyle.Header | StickyStyle.Footer)
.scrollBar(BarState.Off)
}
.width('100%')
.height('100%')
.backgroundColor(0xDCDCDC)
.padding({ top: 5 })
} }
class BasicDataSource implements IDataSource { private listeners: DataChangeListener[] = []; private originDataArray: string[] = [];
public totalCount(): number { return 0; }
public getData(index: number): string | dateListItem { return this.originDataArray[index]; }
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); } }
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); }) } }
class MyDataSource1 extends BasicDataSource { private dataArray: string[] = [];
public totalCount(): number { return this.dataArray.length; }
public getData(index: number): string { return this.dataArray[index]; }
public addData(index: number, data: string): void { this.dataArray.splice(index, 0, data); this.notifyDataAdd(index); }
public pushData(data: string): void { this.dataArray.push(data); this.notifyDataAdd(this.dataArray.length - 1); } }
class MyDataSource2 extends BasicDataSource { private dataArray: dateListItem[] = [];
public totalCount(): number { return this.dataArray.length; }
public getData(index: number): dateListItem { return this.dataArray[index]; }
public addData(index: number, data: dateListItem): void { this.dataArray.splice(index, 0, data); this.notifyDataAdd(index); }
public pushData(data: dateListItem): void { this.dataArray.push(data); this.notifyDataAdd(this.dataArray.length - 1); } }
class dateListItem { date: string; orderList: MyDataSource1;
constructor(date: string) { this.date = date; this.orderList = new MyDataSource1(); } }
按照您说的轮播图您可以使用两个Swiper,参考链接:[https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-container-swiper-V5](https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-container-swiper-V5)
然后懒加载的话,您可以参考:[https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-rendering-control-lazyforeach-0000001820879609](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-rendering-control-lazyforeach-0000001820879609)
HarmonyOS 鸿蒙Next懒加载的具体实践主要依赖于其组件化框架和生命周期管理机制。懒加载是一种优化技术,用于延迟加载非关键资源或数据,直到它们实际需要被展示或使用时才进行加载,从而提升应用的性能和用户体验。
在HarmonyOS中,懒加载通常应用于图像、列表项、模块等组件。实现懒加载的关键在于监听组件的可见性状态,并在组件变得可见时触发数据或资源的加载。
具体来说,可以通过以下步骤实现懒加载:
-
定义懒加载组件:在XML布局文件中定义需要懒加载的组件,如Image、List等。
-
实现可见性监听:利用HarmonyOS提供的组件生命周期回调或自定义监听器,监听组件的可见性变化。当组件变为可见时,触发加载逻辑。
-
数据或资源加载:在组件可见时,通过网络请求、本地文件读取等方式加载所需的数据或资源。
-
更新UI:加载完成后,使用数据或资源更新组件的UI展示。
需要注意的是,懒加载的实现可能因具体应用场景和组件类型的不同而有所差异。开发者应根据实际需求灵活调整懒加载策略。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html