使用LazyForEach嵌套LazyForEach(或ForEach)显示异常。

使用LazyForEach嵌套LazyForEach(或ForEach)显示异常。

HarmonyOS
2024-06-11 20:59:08
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
morning_dxm

该场景不再支持,可以通过如下方式实现嵌套类场景:

方式1: 使用一个LazyForEach进行实现:

class MyDataSource implements IDataSource { 
 private listener: DataChangeListener 
 // 构建嵌套场景下的二维数据列表 
 private dataArray: Array<Array<number>>; 
  
 public initialize() { 
   // 初始化二维数据列表 
   this.dataArray = new Array(); 
   for (let a: number = 0; a < 5; ++a) { 
     this.dataArray[a] = new Array(); 
     for (let b: number = 0; b < 5; ++b) { 
       this.dataArray[a][b] = a * 5 + b; 
     } 
   } 
 } 
  
 public totalCount(): number { 
   return 5 * 5 
 } 
  
 public getData(index: number): any { 
   // 基于二维数组的行列计算index对应的位置及数据。 
   return this.dataArray[Math.floor(index / 5)][index % 5] 
 } 
  
 registerDataChangeListener(listener: DataChangeListener): void { 
   this.listener = listener 
 } 
  
 unregisterDataChangeListener(listener: DataChangeListener): void { 
   this.listener = undefined 
 } 
} 
  
@Entry 
@Component 
struct MyComponent { 
 private data: MyDataSource = new MyDataSource() 
  
 aboutToAppear() { 
   this.data.initialize(); 
 } 
  
 build() { 
   List({ space: 3 }) { 
     LazyForEach(this.data, (item: number) => { 
       ListItem() { 
         Row() { 
           Text(item.toString()).fontSize(20).margin({ left: 10 }) 
         }.margin({ left: 10, right: 10 }) 
       } 
     }) 
   }.width('100%').height('100%') 
 } 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.

方式2:在LazyForEach和LazyForEach嵌套中新增自定义组件进行桥接过渡:

// MyDataSource处理二维数据的行数据信息。 
class MyDataSource extends MyBaseDataSource { 
 private dataArray: Array<number> = [1, 2, 3, 4, 5]; 
  
 public totalCount(): number { 
   return 5; 
 } 
  
 public getData(index: number): any { 
   return this.dataArray[index]; 
 } 
} 
  
// ChildDataSource通过二维数据的行信息处理二维数据的列数据。 
class ChildDataSource extends MyBaseDataSource { 
 private rowNum: number; 
 private dataArray: Array<number> = [1, 2, 3, 4, 5]; 
  
 constructor(rowNum: number) { 
   this.rowNum = rowNum; 
 } 
  
 public totalCount(): number { 
   return 5; 
 } 
  
 public getData(index: number): any { 
   return this.dataArray[index] + 5 * this.rowNum; 
 } 
} 
  
@Component 
struct ChildComponent { 
 private data: ChildDataSource; 
 private rowNum: number; 
  
 aboutToAppear() { 
   this.data = new ChildDataSource(this.rowNum) 
 } 
  
 build() { 
   Column() { 
     // 基于二维数据的行信息构建列数据对应的子组件。 
     LazyForEach(this.data, (item) => { 
       Row() { 
         Text(item.toString()).fontSize(20).margin({ left: 10 }) 
       }.margin({ left: 10, right: 10 }) 
     }) 
   } 
 } 
} 
  
@Entry 
@Component 
struct MyComponent { 
 private data: MyDataSource = new MyDataSource() 
  
 build() { 
   List({ space: 3 }) { 
     LazyForEach(this.data, (item: number) => { 
       // 构建二维数据行信息对应的子组件。 
       ListItem() { 
         ChildComponent({ rowNum: item - 1 }) 
       } 
     }) 
   }.width('100%').height('100%') 
 } 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.

方式3:使用ForEach嵌套ForEach的替代

@Entry 
@Component 
struct MyComponent { 
 @State data: Array<Array<number>> = [] 
  
 aboutToAppear() { 
   // 初始化二维数据列表 
   this.data = new Array(); 
   for (let a: number = 0; a < 5; ++a) { 
     this.data[a] = new Array(); 
     for (let b: number = 0; b < 5; ++b) { 
       this.data[a][b] = a * 5 + b; 
     } 
   } 
 } 
  
 build() { 
   List({ space: 3 }) { 
     ForEach(this.data, (item: Array<number>) => { 
       // 使用ForEach嵌套结构 
       ForEach(item, (item: number) => { 
         ListItem() { 
           Row() { 
             Text(item.toString()).fontSize(20).margin({ left: 10 }) 
           }.margin({ left: 10, right: 10 }) 
         } 
       }) 
     }) 
   }.width('100%').height('100%') 
 } 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
分享
微博
QQ
微信
回复
2024-06-12 22:52:45
相关问题
HarmonyOS lazyForeach嵌套视图问题
884浏览 • 1回复 待解决
ForEach/LazyForEach键值生成规则是怎样的
2417浏览 • 1回复 待解决
list 如何使用 lazyforeach
940浏览 • 1回复 待解决
HarmonyOS swiper + LazyForEach使用问题
1132浏览 • 1回复 待解决
HarmonyOS 如何正确使用LazyForEach
609浏览 • 1回复 待解决
HarmonyOS LazyForEach
825浏览 • 1回复 待解决
LazyForEach使用限制有哪些?
1428浏览 • 1回复 待解决
HarmonyOS LazyForEach组件dataSource使用问题
1505浏览 • 2回复 待解决
ListItemGroup 和lazyforeach如何结合使用
1171浏览 • 1回复 待解决
使用List lazyForeach时,reuseId未生效
821浏览 • 1回复 待解决
ListItemGroup能跟LazyForEach搭配使用
1397浏览 • 1回复 待解决
使用LazyForEach懒加载列表相关问题
1720浏览 • 1回复 待解决
HarmonyOS lazyforEach渲染问题
690浏览 • 1回复 待解决
HarmonyOS lazyForEach相关范例
891浏览 • 1回复 待解决