文档管理中心
您当前正在浏览新版开发者文档中心,目录分类和层级有所调整。点击左侧当前文档分类名称前的“☰”图标,可切换文档分类。 了解新版目录
问题处理与运维开发与测试问题应用框架开发UI框架组件使用如何监听ListItemGroup的Header吸顶状态

如何监听ListItemGroup的Header吸顶状态

问题现象

是否有API能够返回当前ListItemGroup的Header吸顶的状态?

背景知识

  • ListItemGroup:用来展示列表item分组,宽度默认充满List组件,必须配合List组件来使用。
  • onAreaChange:组件区域变化时触发该回调。组件区域变化事件指组件显示的尺寸、位置等发生变化时触发的事件。

解决方案

原理说明:

  1. sticky属性设置:通过.sticky(StickyStyle.Header)启用列表的头部吸顶特性。
  2. 组件区域变化监听:在自定义Header组件中,使用onAreaChange事件监听组件位置变化。
  3. 坐标判断逻辑:通过判断事件参数中的oldValue.position.y === 0 && newValue.position.y === 0时表示未吸顶。
收起
自动换行
深色代码主题
复制
  1. @Entry
  2. @Component
  3. struct StickyHeaderExample {
  4. private arr: number[] = [0, 1];
  5. @Builder
  6. CustomHeader() {
  7. Text('分组标题')
  8. .height(50)
  9. .width('100%')
  10. .backgroundColor(Color.Gray)
  11. .onAreaChange((oldValue: Area, newValue: Area) => {
  12. if (oldValue.position.y === 0 && newValue.position.y === 0) {
  13. console.info('没吸顶');
  14. } else {
  15. console.info(`吸顶了 ${oldValue.position.y}`);
  16. }
  17. });
  18. }
  19. build() {
  20. Column() {
  21. List({ space: 10 }) {
  22. ForEach(this.arr, (item: number) => {
  23. ListItem() {
  24. Text(item.toString())
  25. .width('100%')
  26. .height(50)
  27. .fontSize(16)
  28. .textAlign(TextAlign.Center)
  29. .borderRadius(10)
  30. .backgroundColor(0xFFFFFF);
  31. };
  32. }, (item: string) => item);
  33. ListItemGroup({
  34. header: this.CustomHeader,
  35. space: 10
  36. }) {
  37. ForEach(Array.from({ length: 20 }), (item: void, index: number) => {
  38. ListItem() {
  39. Text(`列表项 ${index}`)
  40. .height(80)
  41. .width('100%')
  42. .backgroundColor('#FFF');
  43. };
  44. });
  45. };
  46. }
  47. .sticky(StickyStyle.Header)
  48. .width('100%')
  49. .height('100%');
  50. };
  51. }
  52. }