分组列表最佳实践,希望提供一个完善的分组列表最佳实践。

希望提供一个完善的分组列表最佳实践。

1.分组列表组件

2.每个独立条目上有复杂布局,特别是输入框、选择按钮等比较难处理的焦点事件等

3.侧滑删除功能

4.可以拖拽条目效果

5.子条目数据会引起列表部分数据或者整体数据的属性更新。

HarmonyOS
2024-06-04 23:43:49
486浏览
已于2024-6-4 23:47:13修改
收藏 0
回答 1
回答 1
按赞同
/
按时间
xiaohur

参考如下代码:

// Basic implementation of IDataSource to handle data listener 
class BasicDataSource implements IDataSource { 
  private listeners: DataChangeListener[] = []; 
  private originDataArray: string[] = []; 
 
  public totalCount(): number { 
    return 0; 
  } 
 
  public getData(index: number): string { 
    return this.originDataArray[index]; 
  } 
 
  // 该方法为框架侧调用,为LazyForEach组件向其数据源处添加listener监听 
  registerDataChangeListener(listener: DataChangeListener): void { 
    if (this.listeners.indexOf(listener) < 0) { 
      console.info('add listener'); 
      this.listeners.push(listener); 
    } 
  } 
 
  // 该方法为框架侧调用,为对应的LazyForEach组件在数据源处去除listener监听 
  unregisterDataChangeListener(listener: DataChangeListener): void { 
    const pos = this.listeners.indexOf(listener); 
    if (pos >= 0) { 
      console.info('remove listener'); 
      this.listeners.splice(pos, 1); 
    } 
  } 
 
  // 通知LazyForEach组件需要重载所有子组件 
  notifyDataReload(): void { 
    this.listeners.forEach(listener => { 
      listener.onDataReloaded(); 
    }) 
  } 
 
  // 通知LazyForEach组件需要在index对应索引处添加子组件 
  notifyDataAdd(index: number): void { 
    this.listeners.forEach(listener => { 
      listener.onDataAdd(index); 
    }) 
  } 
 
  // 通知LazyForEach组件在index对应索引处数据有变化,需要重建该子组件 
  notifyDataChange(index: number): void { 
    this.listeners.forEach(listener => { 
      listener.onDataChange(index); 
    }) 
  } 
 
  // 通知LazyForEach组件需要在index对应索引处删除该子组件 
  notifyDataDelete(index: number): void { 
    this.listeners.forEach(listener => { 
      listener.onDataDelete(index); 
    }) 
  } 
 
  // 通知LazyForEach组件将from索引和to索引处的子组件进行交换 
  notifyDataMove(from: number, to: number): void { 
    this.listeners.forEach(listener => { 
      listener.onDataMove(from, to); 
    }) 
  } 
} 
 
class MyDataSource extends BasicDataSource { 
  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); 
  } 
 
  public deleteData(data: string): void { 
    let index = this.dataArray.indexOf(data) 
    this.dataArray.splice(index, 1) 
    this.notifyDataDelete(index) 
  } 
 
  public moveData(from: number, to: number): void { 
    let temp = this.dataArray[from] 
    this.dataArray[from] = this.dataArray[to] 
    this.dataArray[to] = temp 
    this.notifyDataMove(from, to) 
  } 
} 
 
@Entry 
@Component 
struct MyComponent { 
  private data: MyDataSource = new MyDataSource(); 
  @State text: string = "" 
 
  aboutToAppear() { 
    for (let i = 0; i <= 20; i++) { 
      this.data.pushData(`Hello ${i}`) 
    } 
  } 
 
  @Builder 
  itemEnd() { 
    Row() { 
      Text("删除该项") 
    }.padding("4vp").justifyContent(FlexAlign.SpaceEvenly) 
  } 
 
  @Builder 
  pixelMapBuilder() { //拖拽过程样式 
    Text(this.text).fontSize(50) 
      .backgroundColor(Color.Pink) 
  } 
 
  build() { 
    List({ space: 8 }) { 
      ListItem() { 
        TextInput({ placeholder: "查询条目" }) 
      } 
 
      LazyForEach(this.data, (item: string, index: number) => { 
        ListItem() { 
          Row() { 
            Text(item).fontSize(50).backgroundColor("#f1f2f6").width("100%").borderRadius(8) 
          }.margin({ left: 10, right: 10 }) 
        }.swipeAction({ 
          end: { 
            builder: () => { 
              this.itemEnd() 
            }, 
            onAction: () => { 
              // todo: 待实现功能1侧滑删除,显示实现了数据删除但是UI没有更新 
              animateTo({ duration: 1000 }, () => { 
                this.data.deleteData(item) 
                console.log(JSON.stringify(this.data.dataArray)) 
              }) 
            }, 
            actionAreaDistance: 20, 
            onEnterActionArea: () => { 
            }, 
            onExitActionArea: () => { 
            } 
          } 
        }) 
      }, (item: string) => item) 
    }.cachedCount(5) 
    .onItemDragStart((event: ItemDragInfo, itemIndex: number) => { 
      this.text = this.data.getData(itemIndex) 
      return this.pixelMapBuilder() //设置拖拽过程中显示的图片。 
    }) 
    .onItemDrop((event: ItemDragInfo, itemIndex: number, insertIndex: number, isSuccess: boolean) => { 
      console.log(`itemIndex=${itemIndex},insertIndex=${insertIndex}`) 
      this.data.moveData(itemIndex, insertIndex) 
      console.log(JSON.stringify(this.data.dataArray)) 
    }) 
  } 
}
  • 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.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
分享
微博
QQ
微信
回复
2024-06-05 20:06:53


相关问题
分组列表实践(嵌套列表
1814浏览 • 1回复 待解决
HarmonyOS jsBridge 最佳实践
1143浏览 • 1回复 待解决
HarmonyOS 事件传递最佳实践咨询
835浏览 • 1回复 待解决
应用内整体换肤最佳实践
1412浏览 • 1回复 待解决
网络监听最佳实践有哪些?
1259浏览 • 1回复 待解决
web写入customUseragent最佳实践
1135浏览 • 1回复 待解决
输出静态库最佳实践
1028浏览 • 1回复 待解决
HarmonyOS 应用开发ArkUI布局最佳实践
866浏览 • 1回复 待解决
HarmonyOS 沉浸式状态栏最佳实践
816浏览 • 1回复 待解决
HarmonyOS ts和ets相互引用最佳实践
941浏览 • 1回复 待解决
HarmonyOS 关于音频播放器最佳实践
793浏览 • 1回复 待解决
视频和直播播放HarmonyOS最佳实践
2007浏览 • 1回复 待解决
HarmonyOS 单列和瀑布流最佳实践
1099浏览 • 1回复 待解决
APP内整体置灰最佳实践
1023浏览 • 1回复 待解决
如何设置分组列表圆角和间距
2550浏览 • 1回复 待解决
HarmonyOS 列表分组可折叠和展开
1038浏览 • 1回复 待解决