Skip to content

List 语法

List 组件 仅仅 支持ListItem,ListItemGroup 子组件

List 参数

js
interface ListInterface {
  // 设置当前List初次加载的时候显示起始位置的item索引,默认值是 0

  initialIndex?: number;

  // 子组件主轴方向的间隔, 每个Item之间的间隔

  space?: number | string;

  // 滚动控制器

  scroller?: Scroller;
}

declare class Scroller {
  // 滚动到指定位置
  scrollTo: {
    // 横轴滚动距离
    xOffset: number | string,
    // 纵轴滚动距离
    yOffset: number | string,
    // 滚动动画
    animation?: ScrollAnimationOptions | boolean,
  };
  // 滚动到容器边缘,不区分滚动轴方向,Edge.Top和Edge.Start表现相同,Edge.Bottom和Edge.End表现相同。
  scrollEdge: {
    value: Edge, // Edge.Top | Edge.Bottom | Edge.Start | Edge.End
    options: ScrollEdgeOptions, // 设置滚动到边缘位置的模式
  };

  // 滚动到下一页或者上一页

  scrollPage: {
    next: boolean, // true 表示下一页,false 表示上一页
  };

  // 获取当前的滚动偏移量 结果就是 就是{ xOffset:number , yOffset:number }

  currentOffset: OffsetResult;

  // scrollToIndex 滑动到指定的Index,支持滑动额外偏移量

  scrollToIndex: {
    value: number, // 滑动到指定的Index
    smooth: boolean, // 是否有动效 true 就代表有, false 就代表没有
    align: ScrollAlign, // 滑动对齐方式 ScrollAlign.START
    //  { extraOffset: { value: 230, unit: LengthUnit.VP } }
    // value 就是偏移量 unit 就是单位
    options: ScrollToIndexOptions, // 设置好偏移量
  };

  // scrollBy
  scrollBy: {
    dx: number, // 横轴偏移量
    dy: number, // 纵轴偏移量
  };

  // 是否滚动到底部

  isAtEnd: boolean;

  // {"x":0,"y":0,"width":360,"height":300}

  getItemRect: RectResult; // 获取指定索引的Item的宽度和高度,x,y
}

declare interface ScrollEdgeOptions {
  // 滚动速度

  velocity: number;
}

declare interface ScrollAnimationOptions {
  // 动画 持续时间
  duration?: number;

  // 滚动曲线,默认值是Curve.Ease
  curve?: Curve | ICurve;

  // 滚动是否越界 默认值是false
  canOverScroll?: boolean;
}

参数用法

js
@Entry
@Component
struct Index9 {
@State ListData: string[] = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"]
// 滚动控制器

private scrollControl: Scroller = new Scroller()

build() {
    List(
        {
            initialIndex: 2,
            space: 30,
            scroller: this.scrollControl
        }
    ) {
        ForEach(this.ListData, (content: string, index) => {
            ListItemGroup() {
                ListItem() {
                    Row() {
                        Text(content).fontSize(25).fontColor(Color.Red)
                    }
                }
                .width('100%')
                .height(300)
                .onClick(() => {

                    // 点击滚动到指定位置和动画效果

                    // this.scrollControl.scrollTo({
                    //     xOffset: 0,
                    //     yOffset: 1500,
                    //     animation: {
                    //         curve: Curve.EaseIn,
                    //         duration: 2000,
                    //         canOverScroll: true
                    //     }
                    // })

                    // 点击滚动到容器边缘,第二个参数就是速度

                    // this.scrollControl.scrollEdge(Edge.Bottom, { velocity: 300 })

                    // 点击滚动到下一页

                    // this.scrollControl.scrollPage({ next: true })

                    // 获取目前滚动的距离 结果 就是{ xOffset:0 , yOffset:660 }

                    // console.info(JSON.stringify(this.scrollControl.currentOffset()))

                    // 滚动到指定的序号 支持偏移量

                    // this.scrollControl.scrollToIndex(10, true, ScrollAlign.START,
                    //     { extraOffset: { value: 230, unit: LengthUnit.VP } })

                    // 滚动到指定的距离

                    // this.scrollControl.scrollBy(0, 30)

                    // 是否滚动到底部

                    // console.info(this.scrollControl.isAtEnd().toString())

                    // 获取子组件的索引 获取子组件的大小及相对容器组件的位置。
                    // {"x":0,"y":0,"width":360,"height":300}
                    console.info(JSON.stringify(this.scrollControl.getItemRect(2)))
                })
            }
            .backgroundColor(Color.Pink)

        })
    }
}
}

List 属性

js
declare class ListAttributes {
  // 设置 List 组件排列方向

  listDirection: Axis;

  // 分割线
  divider: {
    // 分割线宽度
    strokeWidth: number,
    // 颜色
    color: Color.Green,
    // 分割线 与列表 侧边 起始端 距离
    startMargin: number,
    // 分割线 与列表 侧边 结束端 距离
    endMargin: number,
  };

  // 是否显示滚动条 BarState BarState.Auto(自动) | BarState.Off(隐藏) | BarState.On (显示)

  scrollBar: BarState;

  // 预加载列表

  cachedCount: number;

   // 设置边缘滑动效果反弹还是遮罩
   //  EdgeEffect.Spring 反弹
   //  EdgeEffect.Fade 遮罩
  edgeEffect:{
       EdgeEffect.Spring
  }

  // chainAnimation  是否开启链式动画
  // 就是 主带次而不是自由滑动
  chainAnimation:boolean

  // 一排放多少个
  lanes: number || {minLength: number, maxLength: number}

  // 当每行 ListItem的宽度小于每行的宽度时,辅轴对齐的方式

  alignListItem: ListItemAlign.Center

  // 配合ListItemGroup组件使用,设置ListItemGroup中header和footer是否要吸顶或吸底。
  // StickyStyle.Header , StickyStyle.Footer , StickyStyle.None
  sticky: StickyStyle.None

  // 是否支持滚动手势

  enableScrollInteraction:Boolean

  // 摩擦系数 例如 0.4
  friction:float

  // 设置起始内容偏移量

  contentStartOffset: number

  // 设置结束内容偏移量
  contentEndOffset:number


}

属性用法

js

@Entry
@Component
struct Index9 {
    @State ListData: string[] = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"]
    // 滚动控制器
    @State arr: string[] =
        ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"]
    @State alignListItem: ListItemAlign = ListItemAlign.Center

    build() {
        Column() {
            List({ space: 20, initialIndex: 0 }) {
                ForEach(this.arr, (item: string) => {
                    ListItem() {
                        Text('' + item)
                            .width(30)
                            .height(100)
                            .fontSize(16)
                            .textAlign(TextAlign.Center)
                            .borderRadius(10)
                            .backgroundColor(0xFFFFFF)
                    }
                    .border({ width: 2, color: Color.Green })
                }, (item: string) => item)
            }
            .height(300)
            .width("90%")

            // 边框

            .border({ width: 3, color: Color.Red })

            // 一排 几个

            .lanes(3)

            // 辅助对其方式

            .alignListItem(this.alignListItem)

            // 滚动条是否显示

            .scrollBar(BarState.Off)

            // 吸顶
            .sticky(StickyStyle.None)

            // 是否支持滚动手势
            .enableScrollInteraction(true)

            // 摩擦系数
            .friction(0.4)

            // 设置内容起始偏移量
            .contentStartOffset(30)

            // 设置内容结束偏移量
            .contentEndOffset(50)

        }
    }
}

List 事件

js
// 滚动开始的序号 ,结束的序号,中间的序号
onScrollIndex((start, end, center) => {
  console.info("--开始的序号---");
  console.info(start.toString());
  console.info("---居中的序号---");
  console.info(center.toString());
  console.info("---结束的序号---");
  console.info(end.toString());
});
// 到达页面开始的位置
onReachStart(() => {
  console.info("到达了页面起始的位置");
});
// 到达页面结束的位置
onReachEnd(() => {
  console.info("到达了页面结束的位置");
});
// 页面开始滑动
onScrollStart(() => {
  console.info("列表开始滑动了");
});
// 页面滚动停止
onScrollStop(() => {
  console.info("列表开始结束滚动");
});
// 列表元素发生移动的时候触发
// from 移动前的索引值
// to 移动后的索引值
// 返回值是boolean 如果移动了就是true,没移动就是false
onItemMove((from: number, to: number) => {
  return false;
});
// 开始拖拽列表元素触发
// event 拖拽点的信息
// itemIndex 被拖拽元素的索引值
onItemDragStart((event: ItemDragInfo, itemIndex: number) => {
  console.info(JSON.stringify(event));
  console.info(itemIndex.toString());
});
// 拖拽列表元素进入列表范围触发
// event 拖拽点的信息
onItemDragEnter((event: ItemDragInfo) => {
  console.info(JSON.stringify(event));
});
// 拖拽列表元素在列表范围内移动的时候触发
// event 拖拽点的信息
// itemIndex 拖拽的起始位置
// insertIndex 拖拽的插入位置
onItemDragMove(
  (event: ItemDragInfo, itemIndex: number, insertIndex: number) => {
    console.info(JSON.stringify(event));
    console.info(itemIndex.toString());
    console.info(insertIndex.toString());
  }
);
// 拖拽列表元素离开列表范围的时候触发
// event 拖拽点的信息
// 拖拽离开的列表元素的索引值
onItemDragLeave((event: ItemDragInfo, itemIndex: number) => {
  console.info(JSON.stringify(event));
  console.info(itemIndex.toString());
});

 // 拖拽结束放开元素
// event 拖拽点的信息
// itemIndex 拖拽起始位置。
// insertIndex 拖拽插入位置
// isSuccess 是否成功释放
.onItemDrop((event: ItemDragInfo, itemIndex: number, insertIndex: number, isSuccess: boolean) => {
    console.info(JSON.stringify(event))
    console.info(itemIndex.toString())
    console.info(insertIndex.toString())
    console.info(isSuccess.toString())
})

 // 滚动组件滑动时触发,返回当前·帧·滑动的偏移量和当前滑动状态
// ScrollState.Idle 对应 0 空间
// ScrollState.Scroll 对应 1 滚动状态
// ScrollState.Fling 对应 2 惯性滚动
.onDidScroll((scrollOffset: number, scrollState: ScrollState) => {
    console.info("页面偏移量")
    console.info(scrollOffset.toString())
    console.info("滑动状态")
    console.info(scrollState.toString())
})

// 滚动组件滑动时触发,返回当前帧滑动的偏移量和当前滑动状态
// ScrollState.Idle 对应 0 空间
// ScrollState.Scroll 对应 1 滚动状态
// ScrollState.Fling 对应 2 惯性滚动
.onWillScroll((scrollOffset: number, scrollState: ScrollState,
    scrollSource: ScrollSource): ScrollResult => {
    console.info("当前帧偏移量" + scrollOffset.toString())
    console.info(scrollState.toString())
    console.info(scrollSource.toString())
    return {
        offsetRemain: 10
    }
})

事件用法

js
@Entry
@Component
struct Index {
    @State message: string[] = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"];

    build() {
        Stack({ alignContent: Alignment.BottomEnd }) {
            List() {
                ForEach(this.message, (content: string, index) => {
                    ListItemGroup() {
                        ListItem() {
                            Column() {
                                Text(content).fontSize(25).fontColor(Color.Red)
                                Divider().width('100%').height(5).backgroundColor(Color.Brown)
                                Text("内容")
                                    .fontSize(25)
                                    .fontColor(Color.Red)
                                    .width('100%')
                                    .height(100)
                                    .backgroundColor(Color.Pink)
                            }
                            .backgroundColor(Color.Green)

                        }
                    }
                })
            }
            // 获取到页面开始 结束 和中间的序号
            .onScrollIndex((start, end, center) => {
                console.info("--开始的序号---")
                console.info(start.toString())
                console.info("---居中的序号---")
                console.info(center.toString())
                console.info("---结束的序号---")
                console.info(end.toString())
            })
            // 到达页面起始的位置
            .onReachStart(() => {
                console.info("到达了页面起始的位置")
            })
            // 到达页面结束的位置
            .onReachEnd(() => {
                console.info("到达了页面结束的位置")
            })
            // 页面开始滑动
            .onScrollStart(() => {
                console.info("列表开始滑动了")
            })
            // 页面滚动停止
            .onScrollStop(() => {
                console.info("列表开始结束滚动")
            })
            // 列表元素发生移动的时候触发
            // from 移动前的索引值
            // to 移动后的索引值
            // 返回值是boolean 如果移动了就是true,没移动就是false
            .onItemMove((from: number, to: number) => {
                return false
            })

            // 开始拖拽列表元素触发
            // event 拖拽点的信息
            // itemIndex 被拖拽元素的索引值
            .onItemDragStart((event: ItemDragInfo, itemIndex: number) => {
                console.info(JSON.stringify(event))
                console.info(itemIndex.toString())
            })

            // 拖拽列表元素进入列表范围触发
            // event 拖拽点的信息
            .onItemDragEnter((event: ItemDragInfo) => {
                console.info(JSON.stringify(event))
            })

            // 拖拽列表元素在列表范围内移动的时候触发
            // event 拖拽点的信息
            // itemIndex 拖拽的起始位置
            // insertIndex 拖拽的插入位置
            .onItemDragMove((event: ItemDragInfo, itemIndex: number, insertIndex: number) => {
                console.info(JSON.stringify(event))
                console.info(itemIndex.toString())
                console.info(insertIndex.toString())
            })
            // 拖拽列表元素离开列表范围的时候触发
            // event 拖拽点的信息
            // itemIndex 拖拽离开的列表元素索引值。
            .onItemDragLeave((event: ItemDragInfo, itemIndex: number) => {
                console.info(JSON.stringify(event))
                console.info(itemIndex.toString())
            })

            // 拖拽结束放开元素
            // event 拖拽点的信息
            // itemIndex 拖拽起始位置。
            // insertIndex 拖拽插入位置
            // isSuccess 是否成功释放
            .onItemDrop((event: ItemDragInfo, itemIndex: number, insertIndex: number, isSuccess: boolean) => {
                console.info(JSON.stringify(event))
                console.info(itemIndex.toString())
                console.info(insertIndex.toString())
                console.info(isSuccess.toString())
            })
            // 滚动组件滑动时触发,返回当前帧滑动的偏移量和当前滑动状态
            // ScrollState.Idle 对应 0 空间
            // ScrollState.Scroll 对应 1 滚动状态
            // ScrollState.Fling 对应 2 惯性滚动
            .onDidScroll((scrollOffset: number, scrollState: ScrollState) => {
                console.info("页面偏移量")
                console.info(scrollOffset.toString())
                console.info("滑动状态")
                console.info(scrollState.toString())
            })

            // 滚动组件滑动时触发,返回当前帧滑动的偏移量和当前滑动状态
            // ScrollState.Idle 对应 0 空间
            // ScrollState.Scroll 对应 1 滚动状态
            // ScrollState.Fling 对应 2 惯性滚动
            .onWillScroll((scrollOffset: number, scrollState: ScrollState,
                scrollSource: ScrollSource): ScrollResult => {
                console.info("当前帧偏移量" + scrollOffset.toString())
                console.info(scrollState.toString())
                console.info(scrollSource.toString())
                return {
                    offsetRemain: 10
                }
            })

            Button("+")
                .margin({
                    right: 10
                })
                .fontSize(21)
                .backgroundColor(Color.Blue)
                .fontColor(Color.Yellow)
                .width(60)
                .height(60)
                .type(ButtonType.Circle)
                .onClick(() => {
                    console.info("开始吧")
                })
                .zIndex(99)
        }
    }
}