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

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

1.分组列表组件

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

3.侧滑删除功能

4.可以拖拽条目效果

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

HarmonyOS
2024-06-04 23:43:49
浏览
已于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)) 
    }) 
  } 
}
分享
微博
QQ
微信
回复
2024-06-05 20:06:53
相关问题
分组列表实践(嵌套列表
428浏览 • 1回复 待解决
如何设置分组列表圆角和间距
613浏览 • 1回复 待解决
如何实现分组列表吸顶/吸底效果
746浏览 • 1回复 待解决
编写一个页面,实现不规则列表
338浏览 • 1回复 待解决
本地收发消息实践,谁有好方案?
222浏览 • 1回复 待解决
OceanBase表分组是什么?
1807浏览 • 1回复 待解决
如何创建OceanBase表分组
2304浏览 • 1回复 待解决
Swiper轮播图带放大缩小动效实践
524浏览 • 1回复 待解决
mysql 分组去重排序问题?
715浏览 • 1回复 待解决
引导遮罩效果实现最佳方案
290浏览 • 1回复 待解决
隐私安全页面跳转实践
1008浏览 • 1回复 待解决
请教 sql 有关分组聚合问题?
1941浏览 • 1回复 待解决
图形图像开发场景实践
301浏览 • 1回复 待解决
能否提供一个关于SM3加密demo?
233浏览 • 1回复 待解决
能否提供一个SM3加密案例
228浏览 • 1回复 待解决