• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# List
2
3<!--Kit: ArkUI-->
4<!--Subsystem: ArkUI-->
5<!--Owner: @yylong-->
6<!--Designer: @yylong-->
7<!--Tester: @liuzhenshuo-->
8<!--Adviser: @HelloCrease-->
9
10列表包含一系列相同宽度的列表项。适合连续、多行呈现同类数据,例如图片和文本。
11
12> **说明:**
13>
14> 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
15>
16> 组件内部已绑定手势实现跟手滚动等功能,需要增加自定义手势操作时请参考[手势拦截增强](ts-gesture-blocking-enhancement.md)进行处理。
17
18
19
20## 子组件
21
22仅支持[ListItem](ts-container-listitem.md)、[ListItemGroup](ts-container-listitemgroup.md)子组件和自定义组件。自定义组件在List下使用时,建议使用ListItem或ListItemGroup作为自定组件的顶层组件,不建议给自定义组件设置属性和事件方法。
23支持通过渲染控制类型([if/else](../../../ui/state-management/arkts-rendering-control-ifelse.md)、[ForEach](../../../ui/state-management/arkts-rendering-control-foreach.md)、[LazyForEach](../../../ui/state-management/arkts-rendering-control-lazyforeach.md)和[Repeat](../../../ui/state-management/arkts-new-rendering-control-repeat.md))动态生成子组件,更推荐使用LazyForEach或Repeat以优化性能。
24
25> **说明:**
26>
27> 如果在处理大量子组件时遇到卡顿问题,请考虑采用懒加载、缓存列表项、动态预加载、组件复用和布局优化等方法来进行优化。最佳实践请参考[优化长列表加载慢丢帧问题](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-best-practices-long-list)28>
29> List的子组件的索引值计算规则:
30>
31> - 按子组件的顺序依次递增。
32>
33> - if/else语句中,只有条件成立的分支内的子组件会参与索引值计算,条件不成立的分支内子组件不计算索引值。
34>
35> - ForEach/LazyForEach/Repeat语句中,会计算展开所有子节点索引值。
36>
37> - [if/else](../../../ui/state-management/arkts-rendering-control-ifelse.md)、[ForEach](../../../ui/state-management/arkts-rendering-control-foreach.md)、[LazyForEach](../../../ui/state-management/arkts-rendering-control-lazyforeach.md)和[Repeat](../../../ui/state-management/arkts-new-rendering-control-repeat.md)发生变化以后,会更新子节点索引值。
38>
39> - ListItemGroup作为一个整体计算一个索引值,ListItemGroup内部的ListItem不计算索引值。
40>
41> - List子组件visibility属性设置为Hidden或None依然会计算索引值。
42
43
44## 接口
45
46List(options?: [ListOptions](#listoptions18对象说明))
47
48创建List列表容器。
49
50**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
51
52**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
53
54**系统能力:** SystemCapability.ArkUI.ArkUI.Full
55
56**参数:**
57
58| 参数名  | 类型 | 必填 | 说明 |
59| ------ | ---- | ---- | ---- |
60| options    | [ListOptions](#listoptions18对象说明)  | 否   | 设置List组件参数。 |
61
62## ListOptions<sup>18+</sup>对象说明
63
64用于设置List组件参数。
65
66> **说明:**
67>
68> 为规范匿名对象的定义,API 18版本修改了此处的元素定义。其中,保留了历史匿名对象的起始版本信息,会出现外层元素@since版本号高于内层元素版本号的情况,但这不影响接口的使用。
69
70**卡片能力:** 从API version 18开始,该接口支持在ArkTS卡片中使用。
71
72**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
73
74**系统能力:** SystemCapability.ArkUI.ArkUI.Full
75
76| 名称       | 类型                                    | 只读 | 可选 | 说明                                                     |
77| ------------ | ------------------------------------------- | ---- | -- | ------------------------------------------------------------ |
78| initialIndex<sup>7+</sup> | number | 否 | 是 | 设置当前List初次加载时显示区域起始位置的item索引值。<br/>默认值:0<br/>**说明:** <br/>设置为负数或超过了当前List最后一个item的索引值时视为无效取值,无效取值按默认值显示。<br/>从API version 14开始,如果在List组件创建完成后首次布局前(如List的onAttach事件中),调用Scroller滚动控制器中不带动画的scrollToIndex或scrollEdge方法,会覆盖initialIndex设置的值。<br/>设置了initialIndex后,List从initialIndex对应的子组件开始布局,在这之前的子组件未参与布局,无法计算准确大小,因此通过[currentOffset](ts-container-scroll.md#currentoffset)接口获取到的List的滚动偏移量通过估算得出,可能会有误差。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
79| space<sup>7+</sup>        | number&nbsp;\|&nbsp;string                  | 否   | 是 | 子组件主轴方向的间隔。<br/>默认值:0<br/>参数类型为number时单位为vp。<br/>**说明:** <br/>设置为负数或者大于等于List内容区长度时,按默认值显示。<br/>space参数值小于List分割线宽度时,子组件主轴方向的间隔取分割线宽度。<br/> List子组件的visibility属性设置为None时不显示,但该子组件上下的space还是会生效。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
80| scroller<sup>7+</sup>      | [Scroller](ts-container-scroll.md#scroller) | 否   | 是 | 可滚动组件的控制器。与List绑定后,可以通过它控制List的滚动。<br/>**说明:** <br/>不允许和其他滚动类组件,如:[ArcList](ts-container-arclist.md)、[List](ts-container-list.md)、[Grid](ts-container-grid.md)、[Scroll](ts-container-scroll.md)和[WaterFlow](ts-container-waterflow.md)绑定同一个滚动控制对象。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
81
82## 属性
83
84除支持[通用属性](ts-component-general-attributes.md)和[滚动组件通用属性](ts-container-scrollable-common.md#属性)外,还支持以下属性:
85
86> **说明:**
87>
88> List组件[通用属性clip](ts-universal-attributes-sharp-clipping.md)的默认值为true。
89
90### listDirection
91
92listDirection(value: Axis)
93
94设置List组件排列方向。
95
96**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
97
98**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
99
100**系统能力:** SystemCapability.ArkUI.ArkUI.Full
101
102**参数:**
103
104| 参数名 | 类型                              | 必填 | 说明                                       |
105| ------ | --------------------------------- | ---- | ------------------------------------------ |
106| value  | [Axis](ts-appendix-enums.md#axis) | 是   | 组件的排列方向。<br/>默认值:Axis.Vertical |
107
108### divider
109
110divider(value: [ListDividerOptions](#listdivideroptions18对象说明) | null)
111
112设置ListItem分割线样式,默认无分割线。
113
114List的分割线画在主轴方向两个子组件之间,第一个子组件上方和最后一个子组件下方不会绘制分割线。
115
116多列模式下,ListItem与ListItem之间的分割线起始边距从每一列的交叉轴方向起始边开始计算,单列模式从List交叉轴方向起始边开始计算。
117
118ListItem设置[多态样式](ts-universal-attributes-polymorphic-style.md)时,被按压的子组件上下的分割线不绘制。
119
120**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
121
122**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
123
124**系统能力:** SystemCapability.ArkUI.ArkUI.Full
125
126**参数:**
127
128| 参数名 | 类型                                                         | 必填 | 说明                                                         |
129| ------ | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
130| value  | [ListDividerOptions](#listdivideroptions18对象说明) \|&nbsp;null | 是   | ListItem分割线样式。<br/>默认值:null |
131
132### scrollBar
133
134scrollBar(value: BarState)
135
136设置滚动条状态。
137
138**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
139
140**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
141
142**系统能力:** SystemCapability.ArkUI.ArkUI.Full
143
144**参数:**
145
146| 参数名 | 类型                                      | 必填 | 说明                                                         |
147| ------ | ----------------------------------------- | ---- | ------------------------------------------------------------ |
148| value  | [BarState](ts-appendix-enums.md#barstate) | 是   | 滚动条状态。<br/>默认值:API version 9及以下版本默认值为BarState.Off,API version 10及以上版本的默认值为BarState.Auto。 |
149
150### cachedCount
151
152cachedCount(value: number)
153
154设置列表中ListItem/ListItemGroup的预加载数量,懒加载场景只会预加载List显示区域外上下各cachedCount行的ListItem,非懒加载场景会全部加载。懒加载、非懒加载都只布局List显示区域+List显示区域外cachedCount的内容。<!--Del-->具体使用可参考[减少应用白块说明](../../../performance/arkts-performance-improvement-recommendation.md#减少应用滑动白块)。<!--DelEnd-->
155
156List设置cachedCount后,显示区域外上下各会预加载并布局cachedCount行ListItem。计算ListItem行数时,会计算ListItemGroup内部的ListItem行数。如果ListItemGroup内没有ListItem,则整个ListItemGroup算一行。
157
158List下嵌套使用LazyForEach,并且LazyForEach下嵌套使用ListItemGroup时,LazyForEach会在List显示区域外上下各会创建cachedCount个ListItemGroup。
159
160**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
161
162**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
163
164**系统能力:** SystemCapability.ArkUI.ArkUI.Full
165
166**参数:**
167
168| 参数名 | 类型   | 必填 | 说明                                                         |
169| ------ | ------ | ---- | ------------------------------------------------------------ |
170| value  | number | 是   | ListItem/ListItemGroup的预加载数量。<br/>默认值:根据屏幕内显示的节点个数设置,最大值为16。<br/>取值范围:[0, +∞) |
171
172### cachedCount<sup>14+</sup>
173
174cachedCount(count: number, show: boolean)
175
176设置列表中ListItem/ListItemGroup的预加载数量,并配置是否显示预加载节点。
177
178List设置cachedCount后,显示区域外上下各会预加载并布局cachedCount行ListItem。计算ListItem行数时,会计算ListItemGroup内部的ListItem行数。如果ListItemGroup内没有ListItem,则整个ListItemGroup算一行。配合[裁剪](ts-universal-attributes-sharp-clipping.md#clip12)或[内容裁剪](ts-container-scrollable-common.md#clipcontent14)属性可以显示出预加载节点。
179
180> **说明:**
181>
182> 通常建议设置cachedCount=n/2(n代表一屏显示的列表项数量),同时需考虑其他因素以实现体验和内存使用的平衡。最佳实践请参考[优化长列表加载慢丢帧问题-缓存列表项](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-best-practices-long-list#section11667144010222)183
184
185**卡片能力:** 从API version 14开始,该接口支持在ArkTS卡片中使用。
186
187**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
188
189**系统能力:** SystemCapability.ArkUI.ArkUI.Full
190
191**参数:**
192
193| 参数名 | 类型   | 必填 | 说明                                   |
194| ------ | ------ | ---- | -------------------------------------- |
195| count  | number | 是   | 预加载的ListItem的数量。<br/>默认值:根据屏幕内显示的节点个数设置,最大值为16。 <br/>取值范围:[0, +∞) |
196| show  | boolean | 是   | 被预加载的ListItem是否需要显示。设置为true时显示预加载的ListItem,设置为false时不显示预加载的ListItem。 <br/> 默认值:false |
197
198### edgeEffect
199
200edgeEffect(value: EdgeEffect, options?: EdgeEffectOptions)
201
202设置边缘滑动效果。
203
204> **说明:**
205>
206> 当List组件的内容区小于一屏时,默认没有回弹效果。若要启用回弹效果,可以通过设置edgeEffect属性的options参数为{ alwaysEnabled: true }来实现。
207
208**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
209
210**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
211
212**系统能力:** SystemCapability.ArkUI.ArkUI.Full
213
214**参数:**
215
216| 参数名                | 类型                                                         | 必填 | 说明                                                         |
217| --------------------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
218| value                 | [EdgeEffect](ts-appendix-enums.md#edgeeffect)                | 是   | List组件的边缘滑动效果,支持弹簧效果和阴影效果。<br/>默认值:EdgeEffect.Spring|
219| options<sup>11+</sup> | [EdgeEffectOptions](ts-container-scrollable-common.md#edgeeffectoptions11对象说明) | 否   | 组件内容大小小于组件自身时,是否开启滑动效果。设置为{ alwaysEnabled: true }会开启滑动效果,{ alwaysEnabled: false }不开启。<br/>默认值:{ alwaysEnabled: false }|
220
221### chainAnimation
222
223chainAnimation(value: boolean)
224
225设置当前List是否启用链式联动动效。
226
227
228> **说明:**
229>
230> - 链式联动效果是指在手指划动过程中,手指拖动的ListItem是主动对象,相邻的ListItem为从动对象,主动对象驱动从动对象联动,驱动效果遵循弹簧物理动效。
231> - 链式动效的驱动效果体现在ListItem之间的间距上。静止状态下的间距可以通过List组件space参数设置,如果不设置space参数并且启用了链式动效,该间距默认为20vp。
232> - 链式动效启用后,List的分割线不显示。
233> - 链式动效生效的前提是List处于单列模式并且边缘效果为EdgeEffect.Spring类型。
234
235**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
236
237**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
238
239**系统能力:** SystemCapability.ArkUI.ArkUI.Full
240
241**参数:**
242
243| 参数名 | 类型    | 必填 | 说明                                                         |
244| ------ | ------- | ---- | ------------------------------------------------------------ |
245| value  | boolean | 是   | 是否启用链式联动动效。<br/>默认值:false,不启用链式联动。true,启用链式联动。 |
246
247### multiSelectable<sup>8+</sup>
248
249multiSelectable(value: boolean)
250
251设置是否开启鼠标框选。
252
253**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
254
255**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
256
257**系统能力:** SystemCapability.ArkUI.ArkUI.Full
258
259**参数:**
260
261| 参数名 | 类型    | 必填 | 说明                                                         |
262| ------ | ------- | ---- | ------------------------------------------------------------ |
263| value  | boolean | 是   | 是否开启鼠标框选。<br/>默认值:false,关闭框选。true,开启框选。 |
264
265### lanes<sup>9+</sup>
266
267lanes(value: number | LengthConstrain, gutter?: Dimension)
268
269设置List组件的布局列数或行数。gutter为列间距,当列数大于1时生效。
270
271规则如下:
272
273- lanes为指定的数量时,列宽由List组件的交叉轴尺寸除以列数得到。
274- lanes设置了{minLength,maxLength}时,根据List组件的宽度自适应决定lanes数量(即列数),保证缩放过程中lane的宽度符合{minLength,maxLength}的限制。其中,minLength条件会被优先满足,即优先保证ListItem的交叉轴尺寸符合最小限制。
275- lanes设置了{minLength,maxLength},如果父组件交叉轴方向尺寸约束为无穷大时,固定按一列排列,List的列宽等于显示区域内最大的ListItem的列宽。
276- &nbsp;ListItemGroup在多列模式下也是独占一行,ListItemGroup中的ListItem按照List组件的lanes属性设置值来布局。
277- lanes设置了{minLength,maxLength}时,计算ListItemGroup中的列数时会按照ListItemGroup的交叉轴尺寸计算。当ListItemGroup交叉轴尺寸与List交叉轴尺寸不一致时ListItemGroup中的列数与List中的列数可能不一样。
278
279**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
280
281**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
282
283**系统能力:** SystemCapability.ArkUI.ArkUI.Full
284
285**参数:**
286
287| 参数名               | 类型                                                         | 必填 | 说明                                     |
288| -------------------- | ------------------------------------------------------------ | ---- | ---------------------------------------- |
289| value                | number&nbsp;\|&nbsp;[LengthConstrain](ts-types.md#lengthconstrain) | 是   | List组件的布局列数或行数。<br/>默认值:1 <br/>取值范围:[1, +∞)|
290| gutter<sup>10+</sup> | [Dimension](ts-types.md#dimension10)                         | 否   | 列间距。<br />默认值:0 <br/>取值范围:[0, +∞)|
291
292### alignListItem<sup>9+</sup>
293
294alignListItem(value: ListItemAlign)
295
296设置List交叉轴方向宽度大于ListItem交叉轴宽度 * lanes + (lanes - 1) * gutter时,ListItem在List交叉轴方向的布局方式。
297
298**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
299
300**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
301
302**系统能力:** SystemCapability.ArkUI.ArkUI.Full
303
304**参数:**
305
306| 参数名 | 类型                                     | 必填 | 说明                                                   |
307| ------ | ---------------------------------------- | ---- | ------------------------------------------------------ |
308| value  | [ListItemAlign](#listitemalign9枚举说明) | 是   | 交叉轴方向的布局方式。<br/>默认值:ListItemAlign.Start |
309
310### sticky<sup>9+</sup>
311
312sticky(value: StickyStyle)
313
314配合[ListItemGroup](ts-container-listitemgroup.md)组件使用,设置ListItemGroup中header是否要吸顶或footer是否要吸底。sticky属性可以设置为 StickyStyle.Header \| StickyStyle.Footer 以同时支持header吸顶和footer吸底。
315
316> **说明:**
317>
318> 由于浮点数计算精度,设置sticky后,在List滑动过程中小概率产生缝隙,可以通过[pixelRound](ts-universal-attributes-pixelRoundForComponent.md#pixelround)指定当前组件向下像素取整解决该问题。
319
320**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
321
322**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
323
324**系统能力:** SystemCapability.ArkUI.ArkUI.Full
325
326**参数:**
327
328| 参数名 | 类型                                 | 必填 | 说明                                                       |
329| ------ | ------------------------------------ | ---- | ---------------------------------------------------------- |
330| value  | [StickyStyle](#stickystyle9枚举说明) | 是   | ListItemGroup吸顶或吸底效果。<br/>默认值:StickyStyle.None |
331
332### scrollSnapAlign<sup>10+</sup>
333
334scrollSnapAlign(value: ScrollSnapAlign)
335
336设置列表项滚动结束对齐效果。
337
338只支持item等高场景限位,不等高场景可能存在不准确的情况。对齐动画期间onWillScroll事件上报的滚动操作来源类型为ScrollSource.FLING339
340**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
341
342**系统能力:** SystemCapability.ArkUI.ArkUI.Full
343
344**参数:**
345
346| 参数名 | 类型                                          | 必填 | 说明                                                      |
347| ------ | --------------------------------------------- | ---- | --------------------------------------------------------- |
348| value  | [ScrollSnapAlign](#scrollsnapalign10枚举说明) | 是   | 列表项滚动结束对齐效果。<br/>默认值:ScrollSnapAlign.NONE |
349
350### enableScrollInteraction<sup>10+</sup>
351
352enableScrollInteraction(value: boolean)
353
354设置是否支持滚动手势。
355
356**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
357
358**系统能力:** SystemCapability.ArkUI.ArkUI.Full
359
360**参数:**
361
362| 参数名 | 类型    | 必填 | 说明                                |
363| ------ | ------- | ---- | ----------------------------------- |
364| value  | boolean | 是   | 是否支持滚动手势。设置为true时可以通过手指或者鼠标滚动,设置为false时无法通过手指或者鼠标滚动,但不影响控制器[Scroller](ts-container-scroll.md#scroller)的滚动接口。<br/>默认值:true |
365
366> **说明:**
367>
368> 组件无法通过鼠标按下拖动操作进行滚动。
369
370### nestedScroll<sup>10+</sup>
371
372nestedScroll(value: NestedScrollOptions)
373
374设置前后两个方向的嵌套滚动模式,实现与父组件的滚动联动。
375
376**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
377
378**系统能力:** SystemCapability.ArkUI.ArkUI.Full
379
380**参数:**
381
382| 参数名 | 类型                                                         | 必填 | 说明           |
383| ------ | ------------------------------------------------------------ | ---- | -------------- |
384| value  | [NestedScrollOptions](ts-container-scrollable-common.md#nestedscrolloptions10对象说明) | 是   | 嵌套滚动选项。<br/>默认值:{ scrollForward: NestedScrollMode.SELF_ONLY, scrollBackward: NestedScrollMode.SELF_ONLY } |
385
386### friction<sup>10+</sup>
387
388friction(value: number | Resource)
389
390设置摩擦系数,手动划动滚动区域时生效,仅影响惯性滚动过程。设置为小于等于0的值时,按默认值处理。
391
392**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
393
394**系统能力:** SystemCapability.ArkUI.ArkUI.Full
395
396**参数:**
397
398| 参数名 | 类型                                                 | 必填 | 说明                                                         |
399| ------ | ---------------------------------------------------- | ---- | ------------------------------------------------------------ |
400| value  | number&nbsp;\|&nbsp;[Resource](ts-types.md#resource) | 是   | 摩擦系数。<br/>默认值:非wearable设备为0.6,wearable设备为0.9。<br/>从API version 11开始,非wearable设备默认值为0.7。<br/>从API version 12开始,非wearable设备默认值为0.75。 |
401
402### contentStartOffset<sup>11+</sup>
403
404contentStartOffset(value: number)
405
406设置内容区域起始偏移量。列表滚动到起始位置时,列表内容与列表显示区域边界保留指定距离。
407
408contentStartOffset + contentEndOffset超过List内容区长度后contentStartOffset和contentEndOffset会置0。
409
410**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
411
412**系统能力:** SystemCapability.ArkUI.ArkUI.Full
413
414**参数:**
415
416| 参数名 | 类型   | 必填 | 说明                                            |
417| ------ | ------ | ---- | ----------------------------------------------- |
418| value  | number | 是   | 内容区域起始偏移量。<br/>默认值:0<br/>单位:vp <br/>**说明:**<br/>设置为负数时,按默认值处理。|
419
420### contentEndOffset<sup>11+</sup>
421
422contentEndOffset(value: number)
423
424设置内容区末尾偏移量。列表滚动到末尾位置时,列表内容与列表显示区域边界保留指定距离。
425
426contentStartOffset + contentEndOffset超过List内容区长度后contentStartOffset和contentEndOffset会置0。
427
428**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
429
430**系统能力:** SystemCapability.ArkUI.ArkUI.Full
431
432**参数:**
433
434| 参数名 | 类型   | 必填 | 说明                                          |
435| ------ | ------ | ---- | --------------------------------------------- |
436| value  | number | 是   | 内容区末尾偏移量。<br/>默认值:0<br/>单位:vp <br/>**说明:**<br/>设置为负数时,按默认值处理。|
437
438### childrenMainSize<sup>12+</sup>
439
440childrenMainSize(value: ChildrenMainSize)
441
442设置List组件的子组件在主轴方向的大小信息。
443
444> **说明:**
445> - 该属性通过向List组件提供所有子组件在主轴方向的大小信息,确保在面对子组件主轴大小不一致、增删子组件、使用[scrollToIndex](ts-container-scroll.md#scrolltoindex)等场景时,List组件能够维护其滑动位置准确性。这样,[scrollTo](ts-container-scroll.md#scrollto)可以准确的跳转到指定位置,[currentOffset](ts-container-scroll.md#currentoffset)可以获取到当前准确的滑动位置,内置滚动条可以实现平滑移动无跳变。
446> - 当子组件是ListItemGroup时,需要根据ListItemGroup的列数、ListItemGroup中ListItem在主轴方向的间距以及ListItemGroup中header、footer和ListItem的大小,来准确计算出ListItemGroup在主轴方向的整体大小,并传递给List组件。
447> - 如果子组件有ListItemGroup,必须为每一个ListItemGroup设置[childrenMainSize](./ts-container-listitemgroup.md#childrenmainsize12)属性。List组件和每一个ListItemGroup组件都要通过childrenMainSize属性接口一对一绑定一个ChildrenMainSize对象。
448> - 多列场景使用LazyForEach生成子组件时,需确保LazyForEach全部生成ListItemGroup组件或者全部生成ListItem组件。
449
450**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
451
452**系统能力:** SystemCapability.ArkUI.ArkUI.Full
453
454**参数:**
455
456| 参数名     | 类型   | 必填 | 说明                            |
457| ---------- | ------ | ---- | ------------------------------- |
458| value | [ChildrenMainSize](ts-container-scrollable-common.md#childrenmainsize12对象说明) | 是   | 该对象用来维护子组件在主轴方向的大小信息。|
459
460### maintainVisibleContentPosition<sup>12+</sup>
461
462maintainVisibleContentPosition(enabled: boolean)
463
464设置显示区域上方插入或删除数据时是否要保持可见内容位置不变。
465
466**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
467
468**系统能力:** SystemCapability.ArkUI.ArkUI.Full
469
470**参数:**
471
472| 参数名 | 类型    | 必填 | 说明                                                         |
473| ------ | ------- | ---- | ------------------------------------------------------------ |
474| enabled  | boolean | 是   | 设置显示区域上方插入或删除数据时是否要保持可见内容位置不变。<br/>默认值:false,显示区域上方插入或删除数据时可见内容位置会跟随变化。 true:显示区域上方插入或删除数据时可见内容位置不变。|
475
476> **说明:**
477> - 只有使用LazyForEach在显示区域外插入或删除数据时,属性设置为true才能保持可见内容位置不变。使用ForEach插入或删除数据、使用LazyForEach重新加载数据时,即使maintainVisibleContentPosition属性设置为true,可见区内容位置也会跟随变化。
478> - 从API version 20开始,使用[Repeat](../../../ui/state-management/arkts-new-rendering-control-repeat.md)在懒加载场景下,显示区域外插入或删除数据时,属性设置为true也能保持可见内容位置不变。
479> - maintainVisibleContentPosition属性设置为true后,在显示区域上方插入或删除数据,会触发onDidScroll、onScrollIndex事件。
480> - maintainVisibleContentPosition属性设置为true后,在多列场景下,一次插入或删除整行数据,可以保持可见内容位置不变,如果不是插入或删除整行数据,可见内容位置还是会发生变化。
481
482### stackFromEnd<sup>19+</sup>
483
484stackFromEnd(enabled: boolean)
485
486设置List组件是否从末尾开始布局。
487
488**原子化服务API:** 从API version 19开始,该接口支持在原子化服务中使用。
489
490**系统能力:** SystemCapability.ArkUI.ArkUI.Full
491
492**参数:**
493
494| 参数名 | 类型    | 必填 | 说明                                                         |
495| ------ | ------- | ---- | ------------------------------------------------------------ |
496| enabled  | boolean | 是   | 设置List组件是否从末尾开始布局。<br/>默认值:false,List从顶部开始布局。 true:List组件从末尾开始布局。|
497
498> **说明:**
499> - stackFromEnd属性设置为true后,当List内容小于List组件高度时,内容底部对齐。
500> - stackFromEnd属性设置为true后,显示区域内有ListItem变高,或有插入ListItem,内容上方的ListItem往上移动。
501> - stackFromEnd属性设置为true后,[ListOptions](#listoptions18对象说明)中initialIndex参数默认值为总item个数-1。
502
503### focusWrapMode<sup>20+</sup>
504
505focusWrapMode(mode: Optional\<FocusWrapMode\>)
506
507设置方向键走焦模式。
508
509**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
510
511**系统能力:** SystemCapability.ArkUI.ArkUI.Full
512
513**参数:**
514
515| 参数名 | 类型                                                         | 必填 | 说明                                                         |
516| ------ | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
517| mode   | Optional\<[FocusWrapMode](ts-appendix-enums.md#focuswrapmode20)\> | 是   | 交叉轴方向键走焦模式。<br/>默认值:FocusWrapMode.DEFAULT<br/>**说明:** <br/>异常值按默认值处理,即交叉轴方向键不能换行。 |
518
519### syncLoad<sup>20+</sup>
520
521syncLoad(enable: boolean)
522
523设置是否同步加载List区域内所有子组件。
524
525**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
526
527**系统能力:** SystemCapability.ArkUI.ArkUI.Full
528
529**参数:**
530
531| 参数名 | 类型                                                         | 必填 | 说明                                                         |
532| ------ | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
533| enable   | boolean | 是   | 是否同步加载List区域内所有子组件。<br/>true表示同步加载,false表示异步加载。默认值:true。<br/>**说明:** <br/>设置为false时,在首次显示、不带动画scrollToIndex跳转场景,若当帧布局耗时超过50ms,会将List区域内尚未布局的子组件延后到下一帧进行布局。 |
534
535### editMode<sup>(deprecated)</sup>
536
537editMode(value: boolean)
538
539设置当前List组件是否处于可编辑模式。可参考[示例3](#示例3设置编辑模式)实现删除选中的list项。
540
541从API version 9开始废弃不再使用,无替代接口。
542
543**系统能力:** SystemCapability.ArkUI.ArkUI.Full
544
545**参数:**
546
547| 参数名 | 类型   | 必填 | 说明                                               |
548| ------ | ------ | ---- | -------------------------------------------------- |
549| value  | boolean | 是   | 当前List组件是否处于可编辑模式。<br/>默认值:false,当前List组件不处于可编辑模式。 |
550
551## ListItemAlign<sup>9+</sup>枚举说明
552
553设置子组件在List交叉轴方向的对齐方式。
554
555**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
556
557**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
558
559**系统能力:** SystemCapability.ArkUI.ArkUI.Full
560
561| 名称     |  值  | 说明                      |
562| ------ | ------ | ------------------------- |
563| Start  | 0 | ListItem在List中,交叉轴方向首部对齐。 |
564| Center | 1 | ListItem在List中,交叉轴方向居中对齐。 |
565| End    | 2 | ListItem在List中,交叉轴方向尾部对齐。 |
566
567## StickyStyle<sup>9+</sup>枚举说明
568
569ListItemGroup吸顶或吸底效果枚举。
570
571**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
572
573**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
574
575**系统能力:** SystemCapability.ArkUI.ArkUI.Full
576
577| 名称     |  值  | 说明                               |
578| ------ | ------ | ---------------------------------- |
579| None   | 0 | ListItemGroup的header不吸顶,footer不吸底。 |
580| Header | 1 | ListItemGroup的header吸顶,footer不吸底。  |
581| Footer | 2 | ListItemGroup的footer吸底,header不吸顶。  |
582
583## ScrollSnapAlign<sup>10+</sup>枚举说明
584
585设置列表项滚动结束对齐效果。
586
587**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
588
589**系统能力:** SystemCapability.ArkUI.ArkUI.Full
590
591| 名称     |  值  | 说明                                     |
592| ------ | ------ | ---------------------------------------- |
593| NONE   | 0 | 默认无项目滚动对齐效果。            |
594| START  | 1 | 视图中的第一项将在列表的开头对齐。<br/>**说明:**<br/>当列表位移至末端,需要将末端的item完整显示,可能出现开头不对齐的情况。 |
595| CENTER | 2 | 视图中的中间项将在列表中心对齐。<br/>**说明:**<br/>顶端和末尾的item都可以在列表中心对齐,列表显示可能露出空白。 |
596| END    | 3 | 视图中的最后一项将在列表末尾对齐。<br/>**说明:**<br/>当列表位移至顶端,需要将顶端的item完整显示,可能出现末尾不对齐的情况。 |
597## CloseSwipeActionOptions<sup>11+</sup>对象说明
598
599收起[EXPANDED](ts-container-listitem.md#swipeactionstate11枚举说明)状态[ListItem](ts-container-listitem.md)回调事件集合,用于设置收起动画完成后回调事件。
600
601**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
602
603**系统能力:** SystemCapability.ArkUI.ArkUI.Full
604
605| 名称     | 类型     | 只读 | 可选 | 说明                   |
606| ------- | -------- | ---- | -- | ---------------------- |
607| onFinish | ()=>void | 否   | 是 | 在收起动画完成后触发。 |
608
609## ListDividerOptions<sup>18+</sup>对象说明
610
611用于设置List或ListItemGroup组件的分割线样式。
612
613> **说明:**
614>
615> 为规范匿名对象的定义,API 18版本修改了此处的元素定义。其中,保留了历史匿名对象的起始版本信息,会出现外层元素@since版本号高于内层元素版本号的情况,但这不影响接口的使用。
616
617**卡片能力:** 从API version 18开始,该接口支持在ArkTS卡片中使用。
618
619**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
620
621**系统能力:** SystemCapability.ArkUI.ArkUI.Full
622
623| 名称     | 类型     | 只读 | 可选 | 说明                   |
624| ------- | -------- | ---- | -- | ---------------------- |
625| strokeWidth<sup>7+</sup> | [Length](ts-types.md#length) | 否   | 否 | 分割线的线宽。<br/>单位:vp<br/>**说明:** <br/>设置为负数,百分比,或者大于等于List内容区长度时,按0处理。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
626| color<sup>7+</sup> | [ResourceColor](ts-types.md#resourcecolor) | 否   | 是 | 分割线颜色。<br/>默认值:0x08000000<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
627| startMargin<sup>7+</sup> | [Length](ts-types.md#length) | 否   | 是 | 分割线与列表侧边起始端的距离。<br/>默认值:0 <br/>单位:vp<br/>**说明:** <br/>设置为负数或者百分比时,按默认值处理。<br/>endMargin + startMargin 超过列宽度后startMargin和endMargin均会被置0。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
628| endMargin<sup>7+</sup> | [Length](ts-types.md#length) | 否   | 是 | 分割线与列表侧边结束端的距离。<br/>默认值:0 <br/>单位:vp<br/> **说明:** <br/>设置为负数或者百分比时,按默认值处理。<br/>endMargin + startMargin 超过列宽度后startMargin和endMargin均会被置0。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
629
630## 事件
631
632除支持[通用事件](ts-component-general-events.md)和[滚动组件通用事件](ts-container-scrollable-common.md#事件)外,还支持以下事件:
633
634### onScrollIndex
635
636onScrollIndex(event: (start: number, end: number, center: number) => void)
637
638有子组件划入或划出List显示区域时触发。计算索引值时,ListItemGroup作为一个整体占一个索引值,不计算ListItemGroup内部ListItem的索引值。
639
640List的边缘效果为弹簧效果时,在List划动到边缘继续划动和松手回弹过程不会触发onScrollIndex事件。
641
642触发该事件的条件:列表初始化时会触发一次,List显示区域内第一个子组件的索引值或最后一个子组件的索引值有变化时会触发。
643
644从API version 10开始,List显示区域中间位置子组件变化时也会触发该事件。
645
646**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
647
648**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
649
650**系统能力:** SystemCapability.ArkUI.ArkUI.Full
651
652**参数:**
653
654| 参数名               | 类型   | 必填 | 说明                                   |
655| -------------------- | ------ | ---- | -------------------------------------- |
656| start                | number | 是   | List显示区域内第一个子组件的索引值     |
657| end                  | number | 是   | List显示区域内最后一个子组件的索引值。 |
658| center<sup>10+</sup> | number | 是   | List显示区域内中间位置子组件的索引值。 |
659
660### onReachStart
661
662onReachStart(event: () => void)
663
664列表到达起始位置时触发。
665
666List初始化时如果initialIndex为0会触发一次,List滚动到起始位置时触发一次。List边缘效果为弹簧效果时,划动经过起始位置时触发一次,回弹回起始位置时再触发一次。
667
668**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
669
670**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
671
672**系统能力:** SystemCapability.ArkUI.ArkUI.Full
673
674**参数:**
675
676| 参数名 | 类型 | 必填 | 说明 |
677| ------ | ------ | ------ | ------|
678| event | () => void | 是 | 列表到达起始位置时触发的回调。 |
679
680### onReachEnd
681
682onReachEnd(event: () => void)
683
684列表到达末尾位置时触发。不满一屏并且最后一个子组件末端在List内时触发。
685
686List边缘效果为弹簧效果时,划动经过末尾位置时触发一次,回弹回末尾位置时再触发一次。
687
688**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
689
690**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
691
692**系统能力:** SystemCapability.ArkUI.ArkUI.Full
693
694**参数:**
695
696| 参数名 | 类型 | 必填 | 说明 |
697| ------ | ------ | ------ | ------|
698| event | () => void | 是 | 列表到达末尾位置时触发的回调。 |
699
700### onScrollFrameBegin<sup>9+</sup>
701
702onScrollFrameBegin(event: OnScrollFrameBeginCallback)
703
704该接口回调时,事件参数传入即将发生的滑动量,事件处理函数中可根据应用场景计算实际需要的滑动量并作为事件处理函数的返回值返回,列表将按照返回值的实际滑动量进行滑动。
705
706当listDirection的值为Axis.Vertical时,返回垂直方向滑动量,当listDirection的值为Axis.Horizontal时,返回水平方向滑动量。
707
708满足以下任一条件时触发该事件:
709
7101. 用户交互(如手指滑动、键鼠操作等)触发滚动。
7112. List惯性滚动。
7123. 调用[fling](ts-container-scroll.md#fling12)接口触发滚动。
713
714不触发该事件的条件:
715
7161. 调用除[fling](ts-container-scroll.md#fling12)接口外的其他滚动控制接口。
7172. 越界回弹。
7183. 拖动滚动条。
719
720**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
721
722**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
723
724**系统能力:** SystemCapability.ArkUI.ArkUI.Full
725
726**参数:**
727
728| 参数名 | 类型                                | 必填 | 说明                       |
729| ------ | ----------------------------------- | ---- | -------------------------- |
730| event | [OnScrollFrameBeginCallback](ts-container-scroll.md#onscrollframebegincallback18)   | 是   | 每帧滚动开始回调函数。 |
731
732### onScrollStart<sup>9+</sup>
733
734onScrollStart(event: () => void)
735
736列表滑动开始时触发。手指拖动列表或列表的滚动条触发的滑动开始时,会触发该事件。使用[Scroller](ts-container-scroll.md#scroller)滑动控制器触发的带动画的滑动,动画开始时会触发该事件。
737
738**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
739
740**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
741
742**系统能力:** SystemCapability.ArkUI.ArkUI.Full
743
744**参数:**
745
746| 参数名 | 类型 | 必填 | 说明 |
747| ------ | ------ | ------ | ------|
748| event | () => void | 是 | 列表滑动开始时触发的回调。 |
749
750### onScrollStop
751
752onScrollStop(event: () => void)
753
754列表滑动停止时触发。手拖动列表或列表的滚动条触发的滑动,手离开屏幕后滑动停止时会触发该事件。使用[Scroller](ts-container-scroll.md#scroller)滑动控制器触发的带动画的滑动,动画停止会触发该事件。
755
756**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
757
758**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
759
760**系统能力:** SystemCapability.ArkUI.ArkUI.Full
761
762**参数:**
763
764| 参数名 | 类型 | 必填 | 说明 |
765| ------ | ------ | ------ | ------|
766| event | () => void | 是 | 列表滑动停止时触发的回调。 |
767
768### onItemMove
769
770onItemMove(event: (from: number, to: number) => boolean)
771
772列表元素发生移动时触发。
773
774**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
775
776**系统能力:** SystemCapability.ArkUI.ArkUI.Full
777
778**参数:**
779
780| 参数名 | 类型   | 必填 | 说明           |
781| ------ | ------ | ---- | -------------- |
782| from   | number | 是   | 移动前索引值。 |
783| to     | number | 是   | 移动后索引值。 |
784
785**返回值:**
786
787| 类型    | 说明           |
788| ------- | -------------- |
789| boolean | 是否已经移动。返回值为true时列表元素发生移动,返回值为false时列表元素没有移动。 |
790
791### onItemDragStart<sup>8+</sup>
792
793onItemDragStart(event: (event: ItemDragInfo, itemIndex: number) => ((() => any) \| void))
794
795开始拖拽列表元素时触发。
796
797**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
798
799**系统能力:** SystemCapability.ArkUI.ArkUI.Full
800
801**参数:**
802
803| 参数名    | 类型                                                      | 必填 | 说明                   |
804| --------- | --------------------------------------------------------- | ---- | ---------------------- |
805| event     | [ItemDragInfo](ts-container-scrollable-common.md#itemdraginfo对象说明) | 是   | 拖拽点的信息。         |
806| itemIndex | number                                                    | 是   | 被拖拽列表元素索引值。 |
807
808### onItemDragEnter<sup>8+</sup>
809
810onItemDragEnter(event: (event: ItemDragInfo) => void)
811
812拖拽列表元素进入列表范围内时触发。
813
814**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
815
816**系统能力:** SystemCapability.ArkUI.ArkUI.Full
817
818**参数:**
819
820| 参数名 | 类型                                                      | 必填 | 说明           |
821| ------ | --------------------------------------------------------- | ---- | -------------- |
822| event  | [ItemDragInfo](ts-container-scrollable-common.md#itemdraginfo对象说明) | 是   | 拖拽点的信息。 |
823
824### onItemDragMove<sup>8+</sup>
825
826onItemDragMove(event: (event: ItemDragInfo, itemIndex: number, insertIndex: number) => void)
827
828拖拽列表元素在列表范围内移动时触发。
829
830**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
831
832**系统能力:** SystemCapability.ArkUI.ArkUI.Full
833
834**参数:**
835
836| 参数名      | 类型                                                      | 必填 | 说明           |
837| ----------- | --------------------------------------------------------- | ---- | -------------- |
838| event       | [ItemDragInfo](ts-container-scrollable-common.md#itemdraginfo对象说明) | 是   | 拖拽点的信息。 |
839| itemIndex   | number                                                    | 是   | 拖拽起始位置。 |
840| insertIndex | number                                                    | 是   | 拖拽插入位置。 |
841
842### onItemDragLeave<sup>8+</sup>
843
844onItemDragLeave(event: (event: ItemDragInfo, itemIndex: number) => void)
845
846拖拽列表元素离开列表范围时触发。
847
848**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
849
850**系统能力:** SystemCapability.ArkUI.ArkUI.Full
851
852**参数:**
853
854| 参数名    | 类型                                                      | 必填 | 说明                       |
855| --------- | --------------------------------------------------------- | ---- | -------------------------- |
856| event     | [ItemDragInfo](ts-container-scrollable-common.md#itemdraginfo对象说明) | 是   | 拖拽点的信息。             |
857| itemIndex | number                                                    | 是   | 拖拽离开的列表元素索引值。 |
858
859### onItemDrop<sup>8+</sup>
860
861onItemDrop(event: (event: ItemDragInfo, itemIndex: number, insertIndex: number, isSuccess: boolean) => void)
862
863绑定该事件的列表可作为拖拽释放目标,当在列表范围内停止拖拽时触发。
864
865跨List拖拽时,当拖拽释放的位置绑定了onItemDrop时isSuccess为true,否则为false。List内部拖拽时,isSuccess为onItemMove事件的返回值。
866
867**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
868
869**系统能力:** SystemCapability.ArkUI.ArkUI.Full
870
871**参数:**
872
873| 参数名      | 类型                                                      | 必填 | 说明           |
874| ----------- | --------------------------------------------------------- | ---- | -------------- |
875| event       | [ItemDragInfo](ts-container-scrollable-common.md#itemdraginfo对象说明) | 是   | 拖拽点的信息。 |
876| itemIndex   | number                                                    | 是   | 拖拽起始位置。 |
877| insertIndex | number                                                    | 是   | 拖拽插入位置。 |
878| isSuccess   | boolean                                                   | 是   | 是否成功释放。返回值为true时列表元素成功释放,返回值为false时列表元素没有成功释放。  |
879
880### onScrollVisibleContentChange<sup>12+</sup>
881onScrollVisibleContentChange(handler: OnScrollVisibleContentChangeCallback)
882
883有子组件划入或划出List显示区域时触发。计算触发条件时,每一个ListItem、ListItemGroup中的header或footer都算一个子组件。
884
885List的边缘效果为弹簧效果时,在List划动到边缘继续划动和松手回弹过程不会触发onScrollVisibleContentChange事件。
886
887触发该事件的条件:列表初始化时会触发一次,List显示区域内第一个子组件的索引值或最后一个子组件的索引值有变化时会触发。
888
889**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
890
891**系统能力:** SystemCapability.ArkUI.ArkUI.Full
892
893**参数:**
894
895| 参数名 | 类型 | 必填 | 说明 |
896| ------ | ------ | ------ | ------|
897| handler | [OnScrollVisibleContentChangeCallback](#onscrollvisiblecontentchangecallback12) | 是 | 当前显示内容发生改变的时候触发回调。 |
898
899### onItemDelete<sup>(deprecated)</sup>
900
901onItemDelete(event: (index: number) => boolean)
902
903当List组件在编辑模式时,点击ListItem右边出现的删除按钮时触发。
904
905从API version 9开始废弃不再使用,无替代接口。
906
907**系统能力:** SystemCapability.ArkUI.ArkUI.Full
908
909**参数:**
910
911| 参数名 | 类型   | 必填 | 说明                     |
912| ------ | ------ | ---- | ------------------------ |
913| index  | number | 是   | 被删除的列表项的索引值。 |
914
915**返回值:**
916
917| 类型    | 说明           |
918| ------- | -------------- |
919| boolean | 是否已经删除。 |
920
921### onScroll<sup>(deprecated)</sup>
922onScroll(event: (scrollOffset: number, scrollState: [ScrollState](#scrollstate枚举说明)) => void)
923
924列表滑动时触发。
925
926从API version 12开始废弃不再使用,推荐使用[onDidScroll](ts-container-scrollable-common.md#ondidscroll12)事件替代。
927
928**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
929
930**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
931
932**系统能力:** SystemCapability.ArkUI.ArkUI.Full
933
934**参数:**
935| 参数名 | 类型 | 必填 | 说明 |
936| ------ | ------ | ------ | ------|
937| scrollOffset | number | 是 | 每帧滚动的偏移量,List的内容向上滚动时偏移量为正,向下滚动时偏移量为负。<br/>单位vp。 |
938| scrollState | [ScrollState](ts-container-list.md#scrollstate枚举说明) | 是 | 当前滑动状态。 |
939
940## ScrollState枚举说明
941
942滑动状态枚举。
943
944**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
945
946**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
947
948**系统能力:** SystemCapability.ArkUI.ArkUI.Full
949
950| 名称     |  值  | 说明                                     |
951| ------ | ------ | ---------------------------------------- |
952| Idle   |  0  | 空闲状态。滚动状态回归空闲时触发,控制器提供的无动画方法控制滚动时触发。 |
953| Scroll |  1  | 滚动状态。手指拖动List,拖动滚动条和滚动鼠标滚轮时触发。|
954| Fling  |  2  | 惯性滚动状态。动画控制的滚动都会触发。包括快速划动松手后的惯性滚动, <br/>划动到边缘回弹的滚动,快速拖动内置滚动条松手后的惯性滚动, <br/>使用滚动控制器提供的带动画的方法控制的滚动。 |
955
956
957## ListScroller<sup>11+</sup>
958
959List组件的滚动控制器,通过它控制List组件的滚动,仅支持一对一绑定到List组件。
960
961**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
962
963**系统能力:** SystemCapability.ArkUI.ArkUI.Full
964
965>  **说明:**
966>
967>  ListScroller继承自[Scroller](ts-container-scroll.md#scroller),具有[Scroller](ts-container-scroll.md#scroller)的全部方法。
968
969
970### 导入对象
971
972```
973listScroller: ListScroller = new ListScroller();
974```
975
976
977### getItemRectInGroup<sup>11+</sup>
978
979getItemRectInGroup(index: number, indexInGroup: number): RectResult
980
981获取[ListItemGroup](ts-container-listitemgroup.md)中的[ListItem](ts-container-listitem.md)的大小和相对于List的位置。
982
983**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
984
985**系统能力:** SystemCapability.ArkUI.ArkUI.Full
986
987**参数:**
988
989| 参数名   | 类型   | 必填   | 说明              |
990| ----- | ------ | ---- | ----------------- |
991| index | number | 是    | ListItemGroup在List中的索引值。 |
992| indexInGroup | number | 是    | ListItem在ListItemGroup中的索引值。 |
993
994> **说明:**
995>
996> - index必须是当前显示区域显示的子组件的索引值,否则视index为非法值。
997> - 索引值为index的子组件必须是ListItemGroup,否则视index为非法值。
998> - indexInGroup必须是当前显示区域内ListItemGroup中显示的ListItem的索引值,否则视indexInGroup为非法值。
999> - index或者indexInGroup为非法值时返回的大小和位置均为0。
1000
1001**返回值:**
1002
1003| 类型       | 说明       |
1004| -------------------  | -------- |
1005| [RectResult](ts-universal-attributes-on-child-touch-test.md#rectresult) | ListItemGroup中的ListItem的大小和相对于List的位置。<br/>单位:vp。 |
1006
1007
1008**错误码**:
1009
1010以下错误码详细介绍请参考[通用错误码](../../errorcode-universal.md)和[滚动类组件错误码](../errorcode-scroll.md)。
1011
1012| 错误码ID | 错误信息 |
1013| ------- | -------- |
1014| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed.   |
1015| 100004   | Controller not bound to component.                               |
1016### getVisibleListContentInfo<sup>14+</sup>
1017
1018getVisibleListContentInfo(x: number, y: number): VisibleListContentInfo
1019
1020根据坐标获取子组件的索引信息。
1021
1022**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
1023
1024**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1025
1026**参数:**
1027
1028| 参数名   | 类型   | 必填   | 说明              |
1029| ----- | ------ | ---- | ----------------- |
1030| x | number | 是    | x轴坐标,单位为vp。 |
1031| y | number | 是    | y轴坐标,单位为vp。 |
1032
1033**返回值:**
1034
1035| 类型       | 说明       |
1036| -------------------  | -------- |
1037|  [VisibleListContentInfo](#visiblelistcontentinfo12对象说明) | 入参坐标处的子组件的索引信息。|
1038
1039> **说明:**
1040>
1041> - 入参坐标(x, y)的基准点是List组件的位置。
1042> - 如果该坐标位置处于ListItem范围内,且该ListItem父组件是List,则返回值对象成员index为该ListItem在List中的索引值,itemGroupArea返回undefined,itemIndexInGroup返回undefined。
1043> - 如果该坐标位置处于ListItem范围内,且该ListItem父组件是ListItemGroup,则返回值对象成员index为该ListItemGroup在List中的索引值,itemGroupArea返回ListItemGroupArea.IN_LIST_ITEM_AREA,itemIndexInGroup返回该ListItem在ListItemGroup中的索引值。
1044> - 如果该坐标位置不处于ListItem范围内,但是处于ListItemGroup的header或者footer范围内,则返回值对象成员index为该ListItemGroup在List中的索引值,itemIndexInGroup返回undefined。如果坐标位置处于header范围,itemGroupArea返回ListItemGroupArea.IN_HEADER_AREA。如果坐标位置处于footer范围,itemGroupArea返回ListItemGroupArea.IN_FOOTER_AREA1045> - 如果该坐标位置既不处于ListItem范围内,也不处于ListItemGroup的header或者footer范围内,但是处于ListItemGroup的范围内,则返回值对象成员index为该ListItemGroup在List中的索引值,itemIndexInGroup返回undefined,itemGroupArea返回ListItemGroupArea.NONE1046> - 如果该坐标位置既不处于ListItem范围内,也不处于ListItemGroup的范围内,则返回值对象成员index为-1,itemIndexInGroup返回undefined,itemGroupArea返回undefined。
1047
1048**错误码**:
1049
1050以下错误码详细介绍请参考[通用错误码](../../errorcode-universal.md)和[滚动类组件错误码](../errorcode-scroll.md)。
1051
1052| 错误码ID | 错误信息 |
1053| ------- | -------- |
1054| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed.   |
1055| 100004   |The controller not bound to component.|
1056### scrollToItemInGroup<sup>11+</sup>
1057
1058scrollToItemInGroup(index: number, indexInGroup: number, smooth?: boolean, align?: ScrollAlign): void
1059
1060滑动到指定的ListItemGroup中指定的ListItem。
1061
1062**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1063
1064**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1065
1066**参数:**
1067
1068| 参数名                | 类型 | 必填 | 说明                                                     |
1069| --------------------- | -------- | ---- | ------------------------------------------------------------ |
1070| index                 | number   | 是   | 要滑动到的目标元素所在的ListItemGroup在当前容器中的索引值。      <br/>**说明:** <br/>index值设置成负值或者大于当前容器子组件的最大索引值,视为异常值,本次跳转不生效。                     |
1071| indexInGroup          | number   | 是   | 要滑动到的目标元素在index指定的ListItemGroup中的索引值。      <br/>**说明:** <br/>indexInGroup值设置成负值或者大于index指定的ListItemGroup容器子组件的最大索引值,视为异常值,本次跳转不生效。|
1072| smooth                | boolean  | 否   | 设置该次滑动是否有动效,true表示有动效,false表示没有动效。<br/>默认值:false<br/>**说明:** <br/>开启动效时,会对经过的所有item进行加载和布局计算,当大量加载item时会导致性能问题。 |
1073| align                 | [ScrollAlign](ts-container-scroll.md#scrollalign10枚举说明)  | 否   | 指定滑动到的元素与当前容器的对齐方式。<br/>默认值:ScrollAlign.START。 |
1074
1075**错误码**:
1076
1077以下错误码详细介绍请参考[通用错误码](../../errorcode-universal.md)和[滚动类组件错误码](../errorcode-scroll.md)。
1078
1079| 错误码ID | 错误信息 |
1080| ------- | -------- |
1081| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed.   |
1082| 100004   | Controller not bound to component.                               |
1083
1084### closeAllSwipeActions<sup>11+</sup>
1085
1086closeAllSwipeActions(options?: CloseSwipeActionOptions): void
1087
1088将[EXPANDED](ts-container-listitem.md#swipeactionstate11枚举说明)状态的[ListItem](ts-container-listitem.md)收起,并设置回调事件。
1089
1090**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1091
1092**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1093
1094**参数:**
1095
1096| 参数名  | 类型                                  | 必填 | 说明                                            |
1097| ------- | ------------------------------------ | ---- | ----------------------------------------------- |
1098| options | [CloseSwipeActionOptions](#closeswipeactionoptions11对象说明) | 否   | 收起[EXPANDED](ts-container-listitem.md#swipeactionstate11枚举说明)状态的[ListItem](ts-container-listitem.md)的回调事件集合。 |
1099
1100
1101**错误码**:
1102
1103以下错误码详细介绍请参考[通用错误码](../../errorcode-universal.md)和[滚动类组件错误码](../errorcode-scroll.md)。
1104
1105| 错误码ID | 错误信息 |
1106| ------- | -------- |
1107| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed.   |
1108| 100004   | Controller not bound to component.                               |
1109
1110> **说明:**
1111>
1112> - ListScroller必须绑定到List组件上。
1113
1114## OnScrollVisibleContentChangeCallback<sup>12+</sup>
1115
1116type OnScrollVisibleContentChangeCallback = (start: VisibleListContentInfo, end: VisibleListContentInfo) => void
1117
1118有子组件划入或划出List显示区域时触发。
1119
1120start和end的index同时返回-1,代表List从有数据变成空的List。
1121
1122start和end的index同时返回0,代表List内只有一个子组件。
1123
1124**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1125
1126**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1127
1128**参数:**
1129
1130| 参数名 | 类型 | 必填 | 说明 |
1131| ------ | ------ | ------ | ------|
1132| start | [VisibleListContentInfo](#visiblelistcontentinfo12对象说明) | 是 | 1. 通过该参数获取List显示区域第一个子组件在List中的索引值。<br/>2. 如果当前List显示区域第一个子组件是ListItemGroup,可以获取当前List显示区域第一个组件属于该ListItemGroup的哪一区域。<br/>3. 如果当前List显示区域第一个组件是ListItemGroup内的ListItem,可以获取该ListItem在ListItemGroup内的索引值。 |
1133| end | [VisibleListContentInfo](#visiblelistcontentinfo12对象说明) | 是 | 1. 通过该参数获取List显示区域最后一个子组件在List中的索引值。<br/>2. 如果当前List显示区域最后一个子组件是ListItemGroup,可以获取当前List显示区域最后一个组件属于该ListItemGroup的哪一区域。<br/>3. 如果当前List显示区域最后一个组件是ListItemGroup内的ListItem,可以获取该ListItem在ListItemGroup内的索引值。 |
1134
1135## VisibleListContentInfo<sup>12+</sup>对象说明
1136
1137用于表示List可见内容区子组件的详细信息。
1138
1139**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1140
1141**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1142
1143| 名称 | 类型 | 只读 | 可选 | 说明 |
1144| ------ | ------ | -- | ------ | ------|
1145| index | number | 否 | 否 | 表示ListItem或ListItemGroup在List中的索引值。 |
1146| itemGroupArea | [ListItemGroupArea](#listitemgrouparea12枚举说明) | 否 | 是 | 表示处于ListItemGroup的哪一个区域。 |
1147| itemIndexInGroup | number | 否 | 是 | 表示ListItem在ListItemGroup中的索引值。 |
1148
1149## ListItemGroupArea<sup>12+</sup>枚举说明
1150
1151枚举了ListItemGroup各个区域。
1152
1153**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1154
1155**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1156
1157| 名称     |  值  | 说明                                     |
1158| ------ | ------ | ---------------------------------------- |
1159| NONE |  0  | ListItemGroup内部ListItem区域、header区域以及footer区域以外的区域。 |
1160| IN_LIST_ITEM_AREA |  1  | ListItemGroup内部ListItem区域。 |
1161| IN_HEADER_AREA |  2  | ListItemGroup内部header区域。 |
1162| IN_FOOTER_AREA |  3  | ListItemGroup内部footer区域。 |
1163
1164## UIListEvent<sup>19+</sup>
1165frameNode中[getEvent('List')](../js-apis-arkui-frameNode.md#geteventlist19)方法的返回值,可用于给List节点设置滚动事件。
1166
1167UIListEvent继承于[UIScrollableCommonEvent](./ts-container-scrollable-common.md#uiscrollablecommonevent19)。
1168
1169### setOnWillScroll<sup>19+</sup>
1170
1171setOnWillScroll(callback:  OnWillScrollCallback | undefined): void
1172
1173设置[onWillScroll](./ts-container-scrollable-common.md#onwillscroll12)事件的回调。
1174
1175方法入参为undefined时,会重置事件回调。
1176
1177**原子化服务API:** 从API version 19开始,该接口支持在原子化服务中使用。
1178
1179**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1180
1181**参数:**
1182
1183| 参数名 | 类型   | 必填 | 说明                       |
1184| ------ | ------ | ---- | -------------------------- |
1185| callback  | [OnWillScrollCallback](./ts-container-scrollable-common.md#onwillscrollcallback12)&nbsp;\|&nbsp;undefined | 是   | onWillScroll事件的回调函数。 |
1186
1187### setOnDidScroll<sup>19+</sup>
1188
1189setOnDidScroll(callback: OnScrollCallback | undefined): void
1190
1191设置[onDidScroll](./ts-container-scrollable-common.md#ondidscroll12)事件的回调。
1192
1193方法入参为undefined时,会重置事件回调。
1194
1195**原子化服务API:** 从API version 19开始,该接口支持在原子化服务中使用。
1196
1197**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1198
1199**参数:**
1200
1201| 参数名 | 类型   | 必填 | 说明                       |
1202| ------ | ------ | ---- | -------------------------- |
1203| callback  | [OnScrollCallback](./ts-container-scrollable-common.md#onscrollcallback12)&nbsp;\|&nbsp;undefined | 是   | onDidScroll事件的回调函数。 |
1204
1205### setOnScrollIndex<sup>19+</sup>
1206
1207setOnScrollIndex(callback: OnListScrollIndexCallback | undefined): void
1208
1209设置[onScrollIndex](#onscrollindex)事件的回调。
1210
1211方法入参为undefined时,会重置事件回调。
1212
1213**原子化服务API:** 从API version 19开始,该接口支持在原子化服务中使用。
1214
1215**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1216
1217**参数:**
1218
1219| 参数名 | 类型   | 必填 | 说明                       |
1220| ------ | ------ | ---- | -------------------------- |
1221| callback  | [OnListScrollIndexCallback](#onlistscrollindexcallback19)&nbsp;\|&nbsp;undefined | 是   | onScrollIndex事件的回调函数。 |
1222
1223### setOnScrollVisibleContentChange<sup>19+</sup>
1224
1225setOnScrollVisibleContentChange(callback: OnScrollVisibleContentChangeCallback | undefined): void
1226
1227设置[onScrollVisibleContentChange](#onscrollvisiblecontentchange12)事件的回调。
1228
1229方法入参为undefined时,会重置事件回调。
1230
1231**原子化服务API:** 从API version 19开始,该接口支持在原子化服务中使用。
1232
1233**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1234
1235**参数:**
1236
1237| 参数名 | 类型   | 必填 | 说明                       |
1238| ------ | ------ | ---- | -------------------------- |
1239| callback  |  [OnScrollVisibleContentChangeCallback](./ts-container-list.md#onscrollvisiblecontentchangecallback12)&nbsp;\|&nbsp;undefined | 是   | onScrollVisibleContentChange事件的回调函数。 |
1240
1241## OnListScrollIndexCallback<sup>19+</sup>
1242type OnListScrollIndexCallback = (start: number, end: number, center: number) => void
1243
1244List组件可见区域item变化事件的回调类型。
1245
1246**卡片能力:** 从API version 19开始,该接口支持在ArkTS卡片中使用。
1247
1248**原子化服务API:** 从API version 19开始,该接口支持在原子化服务中使用。
1249
1250**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1251
1252**参数:**
1253
1254| 参数名               | 类型   | 必填 | 说明                                   |
1255| -------------------- | ------ | ---- | -------------------------------------- |
1256| start   | number | 是   | List显示区域内第一个子组件的索引值。     |
1257| end     | number | 是   | List显示区域内最后一个子组件的索引值。 |
1258| center  | number | 是   | List显示区域内中间位置子组件的索引值。 |
1259
1260## 示例
1261
1262### 示例1(添加滚动事件)
1263该示例实现了设置纵向列表,并在当前显示界面发生改变时回调索引。
1264
1265ListDataSource实现了LazyForEach数据源接口[IDataSource](ts-rendering-control-lazyforeach.md#idatasource),用于通过LazyForEach给List提供子组件。
1266
1267<!--code_no_check-->
1268```ts
1269// ListDataSource.ets
1270export class ListDataSource implements IDataSource {
1271  private list: number[] = [];
1272  private listeners: DataChangeListener[] = [];
1273
1274  constructor(list: number[]) {
1275    this.list = list;
1276  }
1277
1278  totalCount(): number {
1279    return this.list.length;
1280  }
1281
1282  getData(index: number): number {
1283    return this.list[index];
1284  }
1285
1286  registerDataChangeListener(listener: DataChangeListener): void {
1287    if (this.listeners.indexOf(listener) < 0) {
1288      this.listeners.push(listener);
1289    }
1290  }
1291
1292  unregisterDataChangeListener(listener: DataChangeListener): void {
1293    const pos = this.listeners.indexOf(listener);
1294    if (pos >= 0) {
1295      this.listeners.splice(pos, 1);
1296    }
1297  }
1298
1299  // 通知控制器数据删除
1300  notifyDataDelete(index: number): void {
1301    this.listeners.forEach(listener => {
1302      listener.onDataDelete(index);
1303    });
1304  }
1305
1306  // 通知控制器添加数据
1307  notifyDataAdd(index: number): void {
1308    this.listeners.forEach(listener => {
1309      listener.onDataAdd(index);
1310    });
1311  }
1312
1313  // 在指定索引位置删除一个元素
1314  public deleteItem(index: number): void {
1315    this.list.splice(index, 1);
1316    this.notifyDataDelete(index);
1317  }
1318
1319  // 在指定索引位置插入一个元素
1320  public insertItem(index: number, data: number): void {
1321    this.list.splice(index, 0, data);
1322    this.notifyDataAdd(index);
1323  }
1324}
1325```
1326
1327<!--code_no_check-->
1328```ts
1329// xxx.ets
1330import { ListDataSource } from './ListDataSource';
1331
1332@Entry
1333@Component
1334struct ListExample {
1335  private arr: ListDataSource = new ListDataSource([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
1336
1337  build() {
1338    Column() {
1339      List({ space: 20, initialIndex: 0 }) {
1340        LazyForEach(this.arr, (item: number) => {
1341          ListItem() {
1342            Text('' + item)
1343              .width('100%').height(100).fontSize(16)
1344              .textAlign(TextAlign.Center).borderRadius(10).backgroundColor(0xFFFFFF)
1345          }
1346        }, (item: number) => item.toString())
1347      }
1348      .listDirection(Axis.Vertical) // 排列方向
1349      .scrollBar(BarState.Off)
1350      .friction(0.6)
1351      .divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 }) // 每行之间的分界线
1352      .edgeEffect(EdgeEffect.Spring) // 边缘效果设置为Spring
1353      .onScrollIndex((firstIndex: number, lastIndex: number, centerIndex: number) => {
1354        console.info('first' + firstIndex);
1355        console.info('last' + lastIndex);
1356        console.info('center' + centerIndex);
1357      })
1358      .onScrollVisibleContentChange((start: VisibleListContentInfo, end: VisibleListContentInfo) => {
1359        console.info(' start index: ' + start.index +
1360                    ' start item group area: ' + start.itemGroupArea +
1361                    ' start index in group: ' + start.itemIndexInGroup);
1362        console.info(' end index: ' + end.index +
1363                    ' end item group area: ' + end.itemGroupArea +
1364                    ' end index in group: ' + end.itemIndexInGroup);
1365      })
1366      .onDidScroll((scrollOffset: number, scrollState: ScrollState) => {
1367        console.info(`onScroll scrollState = ScrollState` + scrollState + `, scrollOffset = ` + scrollOffset);
1368      })
1369      .width('90%')
1370    }
1371    .width('100%')
1372    .height('100%')
1373    .backgroundColor(0xDCDCDC)
1374    .padding({ top: 5 })
1375  }
1376}
1377```
1378
1379![zh-cn_image_0000001174264378](figures/zh-cn_image_0000001174264378.gif)
1380
1381
1382### 示例2(设置子元素对齐)
1383该示例展示了不同ListItemAlign枚举值下,List组件交叉轴方向子元素对齐效果。
1384
1385ListDataSource说明及完整代码参考[示例1添加滚动事件](#示例1添加滚动事件)。
1386
1387<!--code_no_check-->
1388```ts
1389// xxx.ets
1390import { ListDataSource } from './ListDataSource';
1391
1392@Entry
1393@Component
1394struct ListLanesExample {
1395  arr: ListDataSource = new ListDataSource([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]);
1396  @State alignListItem: ListItemAlign = ListItemAlign.Start;
1397
1398  build() {
1399    Column() {
1400      List({ space: 20, initialIndex: 0 }) {
1401        LazyForEach(this.arr, (item: string) => {
1402          ListItem() {
1403            Text('' + item)
1404              .width('100%')
1405              .height(100)
1406              .fontSize(16)
1407              .textAlign(TextAlign.Center)
1408              .borderRadius(10)
1409              .backgroundColor(0xFFFFFF)
1410          }
1411          .border({ width: 2, color: Color.Green })
1412        }, (item: string) => item)
1413      }
1414      .height(300)
1415      .width('90%')
1416      .friction(0.6)
1417      .border({ width: 3, color: Color.Red })
1418      .lanes({ minLength: 40, maxLength: 40 })
1419      .alignListItem(this.alignListItem)
1420      .scrollBar(BarState.Off)
1421
1422      Button('点击更改alignListItem:' + this.alignListItem).onClick(() => {
1423        if (this.alignListItem == ListItemAlign.Start) {
1424          this.alignListItem = ListItemAlign.Center;
1425        } else if (this.alignListItem == ListItemAlign.Center) {
1426          this.alignListItem = ListItemAlign.End;
1427        } else {
1428          this.alignListItem = ListItemAlign.Start;
1429        }
1430      })
1431    }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 })
1432  }
1433}
1434```
1435
1436![list](figures/list-alignListItem.gif)
1437
1438
1439### 示例3(设置编辑模式)
1440该示例展示了如何设置当前List组件是否处于可编辑模式。
1441
1442ListDataSource说明及完整代码参考[示例1添加滚动事件](#示例1添加滚动事件)。
1443
1444<!--code_no_check-->
1445```ts
1446// xxx.ets
1447import { ListDataSource } from './ListDataSource';
1448
1449@Entry
1450@Component
1451struct ListExample {
1452  arr: ListDataSource=new ListDataSource([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
1453  @State editFlag: boolean = false;
1454
1455  build() {
1456    Stack({ alignContent: Alignment.TopStart }) {
1457      Column() {
1458        List({ space: 20, initialIndex: 0 }) {
1459          LazyForEach(this.arr, (item: number, index?: number) => {
1460            ListItem() {
1461              Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) {
1462                Text('' + item)
1463                  .width('100%')
1464                  .height(80)
1465                  .fontSize(20)
1466                  .textAlign(TextAlign.Center)
1467                  .borderRadius(10)
1468                  .backgroundColor(0xFFFFFF)
1469                  .flexShrink(1)
1470                if (this.editFlag) {
1471                  Button() {
1472                    Text('delete').fontSize(16)
1473                  }.width('30%').height(40)
1474                  .onClick(() => {
1475                    if (index != undefined) {
1476                      console.info(this.arr.getData(index) + 'Delete');
1477                      this.arr.deleteItem(index);
1478                      console.info(JSON.stringify(this.arr));
1479                      this.editFlag = false;
1480                    }
1481                  }).stateEffect(true)
1482                }
1483              }
1484            }
1485          }, (item: number) => item.toString())
1486        }.width('90%')
1487        .scrollBar(BarState.Off)
1488        .friction(0.6)
1489      }.width('100%')
1490
1491      Button('edit list')
1492        .onClick(() => {
1493          this.editFlag = !this.editFlag;
1494        }).margin({ top: 5, left: 20 })
1495    }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 })
1496  }
1497}
1498```
1499
1500![list](figures/list3.gif)
1501
1502### 示例4(设置限位对齐)
1503该示例展示了List组件设置居中限位的实现效果。
1504
1505ListDataSource说明及完整代码参考[示例1添加滚动事件](#示例1添加滚动事件)。
1506
1507<!--code_no_check-->
1508```ts
1509// xxx.ets
1510import { ListDataSource } from './ListDataSource';
1511
1512@Entry
1513@Component
1514struct ListExample {
1515  private arr: ListDataSource=new ListDataSource([]);
1516  private scrollerForList: Scroller = new Scroller();
1517
1518  aboutToAppear() {
1519    let list: number[] = [];
1520    for (let i = 0; i < 20; i++) {
1521      list.push(i);
1522    }
1523    this.arr = new ListDataSource(list);
1524  }
1525
1526  build() {
1527    Column() {
1528      Row() {
1529        List({ space: 20, initialIndex: 3, scroller: this.scrollerForList }) {
1530          LazyForEach(this.arr, (item: number) => {
1531            ListItem() {
1532              Text('' + item)
1533                .width('100%').height(100).fontSize(16)
1534                .textAlign(TextAlign.Center)
1535            }
1536            .borderRadius(10).backgroundColor(0xFFFFFF)
1537            .width('60%')
1538            .height('80%')
1539          }, (item: number) => JSON.stringify(item))
1540        }
1541        .chainAnimation(true)
1542        .edgeEffect(EdgeEffect.Spring)
1543        .listDirection(Axis.Horizontal)
1544        .height('100%')
1545        .width('100%')
1546        .scrollSnapAlign(ScrollSnapAlign.CENTER)
1547        .borderRadius(10)
1548        .backgroundColor(0xDCDCDC)
1549      }
1550      .width('100%')
1551      .height('100%')
1552      .backgroundColor(0xDCDCDC)
1553      .padding({ top: 10 })
1554    }
1555  }
1556}
1557
1558```
1559
1560![list](figures/list4.gif)
1561
1562### 示例5(跳转准确)
1563该示例通过设置childrenMainSize属性,实现了List在子组件高度不一致时调用scrollTo接口也可以跳转准确。
1564
1565如果配合状态管理V2使用,详情见:[List与makeObserved](../../../ui/state-management/arkts-v1-v2-migration-application-and-others.md#滑动组件)。
1566
1567ListDataSource说明及完整代码参考[示例1添加滚动事件](#示例1添加滚动事件)。
1568
1569<!--code_no_check-->
1570```ts
1571// xxx.ets
1572import { ListDataSource } from './ListDataSource';
1573
1574@Entry
1575@Component
1576struct ListExample {
1577  private arr: ListDataSource = new ListDataSource([]);
1578  private scroller: ListScroller = new ListScroller();
1579  @State listSpace: number = 10;
1580  @State listChildrenSize: ChildrenMainSize = new ChildrenMainSize(100);
1581  aboutToAppear(){
1582    // 初始化数据源。
1583    let list: number[] = [];
1584    for (let i = 0; i < 10; i++) {
1585      list.push(i);
1586    }
1587    this.arr = new ListDataSource(list);
1588    // 前5个item的主轴大小不是默认大小100,因此需要通过ChildrenMainSize通知List。
1589    this.listChildrenSize.splice(0, 5, [300, 300, 300, 300, 300]);
1590  }
1591
1592  build() {
1593    Column() {
1594      List({ space: this.listSpace, initialIndex: 4, scroller: this.scroller }) {
1595        LazyForEach(this.arr, (item: number) => {
1596          ListItem() {
1597            Text('item-' + item)
1598              .height( item < 5 ? 300 : this.listChildrenSize.childDefaultSize)
1599              .width('90%')
1600              .fontSize(16)
1601              .textAlign(TextAlign.Center)
1602              .borderRadius(10)
1603              .backgroundColor(0xFFFFFF)
1604          }
1605        }, (item: string) => item)
1606      }
1607      .backgroundColor(Color.Gray)
1608      .layoutWeight(1)
1609      .scrollBar(BarState.On)
1610      .childrenMainSize(this.listChildrenSize)
1611      .alignListItem(ListItemAlign.Center)
1612      Row(){
1613        Button() { Text('item size + 50') }.onClick(()=>{
1614          this.listChildrenSize.childDefaultSize += 50;
1615        }).height('50%').width('30%')
1616        Button() { Text('item size - 50') }.onClick(()=>{
1617          if (this.listChildrenSize.childDefaultSize === 0) {
1618            return;
1619          }
1620          this.listChildrenSize.childDefaultSize -= 50;
1621        }).height('50%').width('30%')
1622        Button() { Text('scrollTo (0, 310)') }.onClick(()=>{
1623          // 310: 跳转到item 1顶部与List顶部平齐的位置。
1624          // 如果不设置childrenMainSize,item高度不一致时scrollTo会不准确。
1625          this.scroller.scrollTo({ xOffset: 0, yOffset: 310 })
1626        }).height('50%').width('30%')
1627      }.height('20%')
1628    }
1629  }
1630}
1631
1632```
1633
1634![list](figures/list5.gif)
1635
1636### 示例6(获得子组件索引信息)
1637该示例展示了含有group时,获得List组件的Item索引相关信息。
1638```ts
1639// xxx.ets
1640class TimeTableDataSource implements IDataSource {
1641  private list: TimeTable[] = [];
1642
1643  constructor(list: TimeTable[]) {
1644    this.list = list;
1645  }
1646
1647  totalCount(): number {
1648    return this.list.length;
1649  }
1650
1651  getData(index: number): TimeTable {
1652    return this.list[index];
1653  }
1654
1655  registerDataChangeListener(listener: DataChangeListener): void {
1656  }
1657
1658  unregisterDataChangeListener(listener: DataChangeListener): void {
1659  }
1660}
1661
1662class ProjectsDataSource implements IDataSource {
1663  private list: string[] = [];
1664
1665  constructor(list: string[]) {
1666    this.list = list;
1667  }
1668
1669  totalCount(): number {
1670    return this.list.length;
1671  }
1672
1673  getData(index: number): string {
1674    return this.list[index];
1675  }
1676
1677  registerDataChangeListener(listener: DataChangeListener): void {
1678  }
1679
1680  unregisterDataChangeListener(listener: DataChangeListener): void {
1681  }
1682}
1683
1684@Entry
1685@Component
1686struct ListItemGroupExample {
1687  private timeTable: TimeTable[] = [
1688  {
1689    title: '星期一',
1690    projects: ['语文', '数学', '英语']
1691  },
1692  {
1693    title: '星期二',
1694    projects: ['物理', '化学', '生物']
1695  },
1696  {
1697    title: '星期三',
1698    projects: ['历史', '地理', '政治']
1699  },
1700  {
1701    title: '星期四',
1702    projects: ['美术', '音乐', '体育']
1703  }
1704];
1705  private scroller: ListScroller = new ListScroller();
1706  @State listIndexInfo: VisibleListContentInfo = { index: -1 };
1707  @State mess:string = "null";
1708  @State itemBackgroundColorArr: boolean[] = [false];
1709  @Builder
1710  itemHead(text: string) {
1711    Text(text)
1712      .fontSize(20)
1713      .backgroundColor(0xAABBCC)
1714      .width('100%')
1715      .padding(10)
1716  }
1717
1718  @Builder
1719  itemFoot(num: number) {
1720    Text('共' + num + "节课")
1721      .fontSize(16)
1722      .backgroundColor(0xAABBCC)
1723      .width('100%')
1724      .padding(5)
1725  }
1726
1727  build() {
1728    Column() {
1729      List({ space: 20, scroller: this.scroller}) {
1730        LazyForEach(new TimeTableDataSource(this.timeTable), (item: TimeTable, index: number) => {
1731          ListItemGroup({ header: this.itemHead(item.title), footer: this.itemFoot(item.projects.length) }) {
1732            LazyForEach(new ProjectsDataSource(item.projects), (project: string, subIndex: number) => {
1733              ListItem() {
1734                Text(project)
1735                  .width('100%')
1736                  .height(100)
1737                  .fontSize(20)
1738                  .textAlign(TextAlign.Center)
1739                  .backgroundColor(this.itemBackgroundColorArr[index * 3 +subIndex] ? 0x68B4FF: 0xFFFFFF)
1740              }
1741            }, (item: string) => item)
1742          }
1743          .divider({ strokeWidth: 1, color: Color.Blue }) // 每行之间的分界线
1744        },(item: string) => item)
1745      }
1746      .width('90%')
1747      .sticky(StickyStyle.Header | StickyStyle.Footer)
1748      .scrollBar(BarState.Off)
1749      .gesture(
1750        PanGesture()
1751          .onActionUpdate((event: GestureEvent) => {
1752            if (event.fingerList[0] != undefined && event.fingerList[0].localX != undefined && event.fingerList[0].localY != undefined) {
1753              this.listIndexInfo  = this.scroller.getVisibleListContentInfo(event.fingerList[0].localX, event.fingerList[0].localY);
1754              let itemIndex:string = 'undefined';
1755              if (this.listIndexInfo.itemIndexInGroup != undefined ) {
1756                itemIndex = this.listIndexInfo.itemIndexInGroup.toString();
1757                if (this.listIndexInfo.index != undefined && this.listIndexInfo.index >= 0 &&
1758                  this.listIndexInfo.itemIndexInGroup >= 0 ) {
1759                  this.itemBackgroundColorArr[this.listIndexInfo.index * 3 + this.listIndexInfo.itemIndexInGroup] = true;
1760                }
1761              }
1762              this.mess = 'index:' + this.listIndexInfo.index.toString() + ' itemIndex:' + itemIndex;
1763            }
1764          }))
1765      .gesture(
1766        TapGesture({ count: 1 })
1767          .onAction((event: GestureEvent) => {
1768            if (event) {
1769              this.itemBackgroundColorArr.splice(0,this.itemBackgroundColorArr.length);
1770            }
1771          })
1772      )
1773      Text('您当前位置Item索引为'+ this.mess)
1774        .fontColor(Color.Red)
1775        .height(50)
1776    }.width('100%').height('90%').backgroundColor(0xDCDCDC).padding({ top: 5 })
1777  }
1778}
1779
1780interface TimeTable {
1781  title: string;
1782  projects: string[];
1783}
1784
1785```
1786
1787![list](figures/getItemIndex_listGroup.gif)
1788
1789### 示例7(设置边缘渐隐)
1790该示例实现了List组件开启边缘渐隐效果并设置边缘渐隐长度。
1791
1792ListDataSource说明及完整代码参考[示例1添加滚动事件](#示例1添加滚动事件)。
1793
1794<!--code_no_check-->
1795```ts
1796import { LengthMetrics } from '@kit.ArkUI'
1797import { ListDataSource } from './ListDataSource';
1798@Entry
1799@Component
1800struct ListExample {
1801  private arr: ListDataSource=new ListDataSource([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]);
1802  scrollerForList: Scroller = new Scroller();
1803
1804  build() {
1805    Column() {
1806
1807      List({ space: 20, initialIndex: 0, scroller: this.scrollerForList }) {
1808        LazyForEach(this.arr, (item: number) => {
1809          ListItem() {
1810            Text('' + item)
1811              .width('100%').height(100).fontSize(16)
1812              .textAlign(TextAlign.Center).borderRadius(10).backgroundColor(0xFFFFFF)
1813          }
1814        }, (item: number) => item.toString())
1815      }
1816      .fadingEdge(true, { fadingEdgeLength: LengthMetrics.vp(80) })
1817    }
1818    .width('100%')
1819    .height('100%')
1820    .backgroundColor(0xDCDCDC)
1821    .padding({ top: 5 })
1822  }
1823}
1824```
1825
1826![fadingEdge_list](figures/fadingEdge_list.gif)
1827
1828### 示例8(单边边缘效果)
1829
1830该示例通过edgeEffect接口,实现了List组件设置单边边缘效果。
1831
1832ListDataSource说明及完整代码参考[示例1添加滚动事件](#示例1添加滚动事件)。
1833
1834<!--code_no_check-->
1835```ts
1836// xxx.ets
1837import { ListDataSource } from './ListDataSource';
1838
1839@Entry
1840@Component
1841struct ListExample {
1842  private arr: ListDataSource = new ListDataSource([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]);
1843  scrollerForList: Scroller = new Scroller();
1844  build() {
1845    Column() {
1846      List({ space: 20, initialIndex: 0, scroller: this.scrollerForList }) {
1847        LazyForEach(this.arr, (item: number) => {
1848          ListItem() {
1849            Text('' + item)
1850              .width('100%').height(100).fontSize(16)
1851              .textAlign(TextAlign.Center).borderRadius(10).backgroundColor(0xFFFFFF)
1852          }
1853        }, (item: string) => item)
1854      }
1855      .edgeEffect(EdgeEffect.Spring, {alwaysEnabled: true, effectEdge: EffectEdge.START})
1856      .width('90%').height('90%')
1857    }
1858    .width('100%')
1859    .height('100%')
1860    .backgroundColor(0xDCDCDC)
1861    .padding({ top: 5 })
1862  }
1863}
1864```
1865
1866![edgeEffect_list](figures/edgeEffect_list.gif)
1867
1868### 示例9(设置折行走焦)
1869
1870该示例通过focusWrapMode接口,实现了List组件方向键走焦换行效果。
1871
1872```ts
1873@Entry
1874@Component
1875struct ListExample {
1876  @State arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1877  build() {
1878    Stack({ alignContent: Alignment.TopStart }) {
1879      Column() {
1880        List({ space: 40, initialIndex: 0 }) {
1881          ForEach(this.arr, (item: number, index?: number) => {
1882            ListItem() {
1883              Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) {
1884                Text('' + item)
1885                  .width(150)
1886                  .height(93)
1887                  .fontSize(30)
1888                  .textAlign(TextAlign.Center)
1889                  .borderRadius(10)
1890                  .backgroundColor(0xFFFFFF)
1891                  .flexShrink(1)
1892                  .focusable(true)
1893                  .offset({ left: 5 })
1894              }
1895            }
1896          }, (item: string) => item)
1897        }
1898        .lanes(2)
1899        .contentStartOffset(20)
1900        .contentEndOffset(20)
1901        .width('100%')
1902        .scrollBar(BarState.Off)
1903        .friction(0.6)
1904        .focusWrapMode(FocusWrapMode.WRAP_WITH_ARROW)
1905        .alignListItem(ListItemAlign.Center)
1906        .offset({ left: 20 })
1907      }.width('90%')
1908    }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 })
1909  }
1910}
1911```
1912
1913![edgeEffect_list](figures/focusWrapMode_list.gif)
1914
1915### 示例10(设置显示区域外插入数据时,保持显示内容不变)
1916
1917该示例通过maintainVisibleContentPosition接口,实现了上滑无限加载历史消息场景。
1918
1919ListDataSource说明及完整代码参考[示例1添加滚动事件](#示例1添加滚动事件)。
1920
1921<!--code_no_check-->
1922```ts
1923import { ListDataSource } from './ListDataSource';
1924
1925@Entry
1926@Component
1927struct ListExample {
1928  private arr: ListDataSource = new ListDataSource([990, 991, 992, 993, 994, 995, 996, 997, 998, 999]);
1929  build() {
1930    Column() {
1931      List({ space: 20, initialIndex: 9 }) {
1932        LazyForEach(this.arr, (item: number) => {
1933          ListItem() {
1934            Text('message:' + item)
1935              .width('100%').height(100)
1936              .fontSize(16)
1937              .textAlign(TextAlign.Center)
1938              .borderRadius(10)
1939              .backgroundColor(0xFFFFFF)
1940          }
1941        }, (item: number) => item.toString())
1942      }
1943      .maintainVisibleContentPosition(true)
1944      .onScrollIndex((start:number)=>{
1945        if (start < 5) {
1946          for (let i = 0; i < 10; i++) {
1947            this.arr.insertItem(0, this.arr.getData(0) - 1);
1948          }
1949        }
1950      })
1951    }
1952    .width('100%')
1953    .height('100%')
1954    .backgroundColor(0xDCDCDC)
1955    .padding(12)
1956  }
1957}
1958```
1959
1960![edgeEffect_list](figures/list_maintainvisiblecontentposition.gif)
1961
1962### 示例11(设置滚动条的边距)
1963
1964该示例展示了在设置了[contentStartOffset](#contentstartoffset11)、[contentEndOffset](#contentendoffset11)属性的情况下,设置滚动条边距的效果。
1965
1966<!--code_no_check-->
1967```ts
1968// xxx.ets
1969import { LengthMetrics } from '@kit.ArkUI';
1970
1971@Entry
1972@Component
1973struct ListScrollBarMarginExample {
1974  @State arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
1975
1976  build() {
1977    Column() {
1978      List({ space: 40, initialIndex: 0 }) {
1979        ForEach(this.arr, (item: number, index?: number) => {
1980          ListItem() {
1981            Text('' + item)
1982              .width('100%')
1983              .height(100)
1984              .fontSize(16)
1985              .textAlign(TextAlign.Center)
1986              .borderRadius(10)
1987              .backgroundColor(0xFFFFFF)
1988          }
1989        }, (item: string) => item)
1990      }
1991      .contentStartOffset(20)
1992      .contentEndOffset(20)
1993      .scrollBar(BarState.On)
1994      .scrollBarMargin({ start: LengthMetrics.vp(20), end: LengthMetrics.vp(20) })
1995      .width('90%')
1996    }
1997    .width('100%')
1998    .height('100%')
1999    .backgroundColor(0xDCDCDC)
2000    .padding({ top: 5 })
2001  }
2002}
2003```
2004
2005![list_contentStartOffset](figures/list_contentStartOffset.gif)