• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# ListItem
2
3用来展示列表具体item,必须配合List来使用。
4
5> **说明:**
6>
7> - 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
8> - 该组件的父组件只能是[List](ts-container-list.md)或者[ListItemGroup](ts-container-listitemgroup.md)。
9> - 当ListItem配合LazyForEach使用时,ListItem子组件在ListItem创建时创建。配合if/else、ForEach使用时,或父组件为List/ListItemGroup时,ListItem子组件在ListItem布局时创建。
10
11## 子组件
12
13可以包含单个子组件。
14
15## 接口
16
17### ListItem<sup>10+</sup>
18
19ListItem(value?: ListItemOptions)
20
21创建ListItem组件。
22
23**卡片能力:** 从API version 10开始,该接口支持在ArkTS卡片中使用。
24
25**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
26
27**系统能力:** SystemCapability.ArkUI.ArkUI.Full
28
29**参数:**
30
31| 参数名 | 类型                                      | 必填 | 说明                                                     |
32| ------ | --------------------------------------------- | ---- | ------------------------------------------------------------ |
33| value  | [ListItemOptions](#listitemoptions10对象说明) | 否   | 为ListItem提供可选参数,该对象内含有ListItemStyle枚举类型的style参数。 |
34
35### ListItem<sup>(deprecated)</sup>
36
37ListItem(value?: string)
38
39创建ListItem组件。
40
41从API version 10开始,该接口不再维护,推荐使用[ListItem<sup>10+</sup>](#listitem10)。
42
43**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
44
45**系统能力:** SystemCapability.ArkUI.ArkUI.Full
46
47**参数:**
48
49| 参数名 | 类型                      | 必填 | 说明 |
50| ------ | ----------------------------- | ---- | -------- |
51| value  | string | 否   | 无       |
52
53## 属性
54
55除支持[通用属性](ts-component-general-attributes.md)外,还支持以下属性:
56
57### sticky<sup>(deprecated)</sup>
58
59sticky(value: Sticky)
60
61设置ListItem吸顶效果。
62
63从API version9开始废弃不再使用,推荐使用[List组件sticky属性](ts-container-list.md#sticky9)。
64
65**系统能力:** SystemCapability.ArkUI.ArkUI.Full
66
67**参数:**
68
69| 参数名 | 类型                                | 必填 | 说明                                       |
70| ------ | ----------------------------------- | ---- | ------------------------------------------ |
71| value  | [Sticky](#stickydeprecated枚举说明) | 是   | ListItem吸顶效果。<br/>默认值:Sticky.None |
72
73### editable<sup>(deprecated)</sup>
74
75editable(value: boolean | EditMode)
76
77设置当前ListItem元素是否可编辑,进入编辑模式后可删除或移动列表项。
78
79从API version9开始废弃不再使用,无替代接口。
80
81**系统能力:** SystemCapability.ArkUI.ArkUI.Full
82
83**参数:**
84
85| 参数名 | 类型                                                         | 必填 | 说明                                       |
86| ------ | ------------------------------------------------------------ | ---- | ------------------------------------------ |
87| value  | boolean&nbsp;\|&nbsp;[EditMode](#editmodedeprecated枚举说明) | 是   | ListItem元素是否可编辑。<br/>默认值:false |
88
89### selectable<sup>8+</sup>
90
91selectable(value: boolean)
92
93设置当前ListItem元素是否可以被鼠标框选。外层List容器的鼠标框选开启时,ListItem的框选才生效。
94
95**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
96
97**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
98
99**系统能力:** SystemCapability.ArkUI.ArkUI.Full
100
101**参数:**
102
103| 参数名 | 类型    | 必填 | 说明                                              |
104| ------ | ------- | ---- | ------------------------------------------------- |
105| value  | boolean | 是   | ListItem元素是否可以被鼠标框选。设置为true时可以被鼠标框选,设置为false时无法被鼠标框选。<br/>默认值:true |
106
107### selected<sup>10+</sup>
108
109selected(value: boolean)
110
111设置当前ListItem选中状态。该属性支持[$$](../../../ui/state-management/arkts-two-way-sync.md)双向绑定变量。该属性需要在设置[选中态样式](./ts-universal-attributes-polymorphic-style.md)前使用才能生效选中态样式。
112
113**卡片能力:** 从API version 10开始,该接口支持在ArkTS卡片中使用。
114
115**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
116
117**系统能力:** SystemCapability.ArkUI.ArkUI.Full
118
119**参数:**
120
121| 参数名 | 类型    | 必填 | 说明                                     |
122| ------ | ------- | ---- | ---------------------------------------- |
123| value  | boolean | 是   | 当前ListItem选中状态。设置为true时为选中状态,设置为false时为默认状态。<br/>默认值:false |
124
125### swipeAction<sup>9+</sup>
126
127swipeAction(value: SwipeActionOptions)
128
129用于设置ListItem的划出组件。
130
131**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
132
133**系统能力:** SystemCapability.ArkUI.ArkUI.Full
134
135**参数:**
136
137| 参数名 | 类型                                              | 必填 | 说明                 |
138| ------ | ------------------------------------------------- | ---- | -------------------- |
139| value  | [SwipeActionOptions](#swipeactionoptions9对象说明) | 是   | ListItem的划出组件。 |
140
141## Sticky<sup>(deprecated)</sup>枚举说明
142
143ListItem吸顶效果枚举。
144
145从API version9开始废弃不再使用,推荐使用[List组件stickyStyle枚举](ts-container-list.md#stickystyle9枚举说明)。
146
147**系统能力:** SystemCapability.ArkUI.ArkUI.Full
148
149| 名称 | 值 | 说明 |
150| -------- | -------- | -------- |
151| None |  0  | 无吸顶效果。 |
152| Normal |  1  | 当前item吸顶。 |
153| Opacity |  2  | 当前item吸顶显示透明度变化效果。 |
154
155## EditMode<sup>(deprecated)</sup>枚举说明
156
157ListItem元素编辑模式枚举。
158
159从API version9开始废弃不再使用,无替代接口。
160
161**系统能力:** SystemCapability.ArkUI.ArkUI.Full
162
163| 名称     | 值 | 说明      |
164| ------ | ------ | --------- |
165| None   |  0  | 编辑操作不限制。    |
166| Deletable |  1  | 可删除。 |
167| Movable |  2  | 可移动。 |
168
169## SwipeEdgeEffect<sup>9+</sup>枚举说明
170
171滑动效果枚举。
172
173**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
174
175**系统能力:** SystemCapability.ArkUI.ArkUI.Full
176
177| 名称     | 值 | 说明      |
178| ------ | ------ | --------- |
179|   Spring   |    0    | ListItem划动距离超过划出组件大小后可以继续划动。<br>如果设置了删除区域,ListItem划动距离超过删除阈值后可以继续划动,<br/>松手后按照弹簧阻尼曲线回弹。 |
180|   None   |    1    | ListItem划动距离不能超过划出组件大小。<br>如果设置了删除区域,ListItem划动距离不能超过删除阈值,<br/>并且在设置删除回调的情况下,达到删除阈值后松手触发删除回调。 |
181
182## SwipeActionOptions<sup>9+</sup>对象说明
183
184start和end对应的@builder函数中顶层必须是单个组件,不能是if/else、ForEach、LazyForEach语句。
185
186滑动手势只在listItem区域上,如果子组件划出ListItem区域外,在ListItem以外部分不会响应划动手势。所以在多列模式下,建议不要将划出组件设置太宽。
187
188**系统能力:** SystemCapability.ArkUI.ArkUI.Full
189
190| 名称                         | 类型                                                         | 必填 | 说明                                                         |
191| ---------------------------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
192| start                        | [CustomBuilder](ts-types.md#custombuilder8)&nbsp;\|&nbsp;[SwipeActionItem](#swipeactionitem10对象说明) | 否   | ListItem向右划动时item左边的组件(List垂直布局时)或ListItem向下划动时item上方的组件(List水平布局时)。 <br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
193| end                          | [CustomBuilder](ts-types.md#custombuilder8)&nbsp;\|&nbsp;[SwipeActionItem](#swipeactionitem10对象说明) | 否   | ListItem向左划动时item右边的组件(List垂直布局时)或ListItem向上划动时item下方的组件(List水平布局时)。 <br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
194| edgeEffect                   | [SwipeEdgeEffect](#swipeedgeeffect9枚举说明)                 | 否   | 滑动效果。 <br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                                                |
195| onOffsetChange<sup>11+</sup> | (offset: number) => void                                     | 否   | 滑动操作偏移量更改时调用。 <br/>**说明:** <br/> 当列表项向左或向右滑动(当列表方向为“垂直”时),向上或向下滑动(当列方向为“水平”时)位置发生变化触发,以vp为单位。<br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。|
196
197## SwipeActionItem<sup>10+</sup>对象说明
198
199List垂直布局,ListItem向右滑动,item左边的长距离滑动删除选项或向左滑动时,item右边的长距离滑动删除选项。
200</br>List水平布局,ListItem向上滑动,item下边的长距离滑动删除选项或向下滑动时,item上边的长距离滑动删除选项。
201
202**系统能力:** SystemCapability.ArkUI.ArkUI.Full
203
204| 名称                 | 类型                                                     | 必填 | 说明                                                         |
205| -------------------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
206| actionAreaDistance | [Length](ts-types.md#length) | 否 | 设置组件长距离滑动删除距离阈值。<br/>默认值:56vp <br/>**说明:** <br/>不支持设置百分比。<br/>删除距离阈值大于item宽度减去划出组件宽度,或删除距离阈值小于等于0就不会设置删除区域。 <br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
207| onAction | () => void | 否 | 组件进入长距删除区后删除ListItem时调用,进入长距删除区后抬手时触发。<br/>**说明:** <br/> 滑动后松手的位置超过或等于设置的距离阈值,并且设置的距离阈值有效时才会触发。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
208| onEnterActionArea | () => void | 否 | 在滑动条目进入删除区域时调用,只触发一次,当再次进入时仍触发。 <br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
209| onExitActionArea | () => void | 否 |当滑动条目退出删除区域时调用,只触发一次,当再次退出时仍触发。 <br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
210| builder |  [CustomBuilder](ts-types.md#custombuilder8) | 否 |当列表项向左或向右滑动(当列表方向为“垂直”时),向上或向下滑动(当列方向为“水平”时)时显示的操作项。 <br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
211| builderComponent<sup>18+</sup> |  [ComponentContent](../js-apis-arkui-ComponentContent.md) | 否 |当列表项向左或向右滑动(当列表方向为“垂直”时),向上或向下滑动(当列方向为“水平”时)时显示的操作项。 <br/>**说明:** <br/>该参数的优先级高于参数builder。即同时设置builder和builderComponent时,以builderComponent设置的值为准。<br/> 同一个builderComponent不推荐同时给不同的start/end使用,否则会导致显示问题。 <br/>**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。|
212| onStateChange<sup>11+</sup> | (state:[SwipeActionState](#swipeactionstate11枚举说明)) => void | 否 |当列表项滑动状态变化时候触发。 <br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。|
213## ListItemOptions<sup>10+</sup>对象说明
214
215ListItem组件参数。
216
217**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
218
219**系统能力:** SystemCapability.ArkUI.ArkUI.Full
220
221| 名称  | 类型                                  | 必填 | 说明                                                         |
222| ----- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
223| style | [ListItemStyle](#listitemstyle10枚举说明) | 否   | 设置List组件卡片样式。<br/>默认值:ListItemStyle.NONE<br/>设置为ListItemStyle.NONE时无样式。<br/>设置为ListItemStyle.CARD时,建议配合[ListItemGroup](ts-container-listitemgroup.md)的ListItemGroupStyle.CARD同时使用,显示默认卡片样式。  <br/>卡片样式下,ListItem默认规格:高度48vp,宽度100%,左右内边距8vp。如果需要实现ListItem高度自适应,可以把height设置为undefined。<br/>卡片样式下,为卡片内的列表选项提供了默认的focus、hover、press、selected和disable样式。<br/>**说明:**<br/>当前卡片模式下,使用默认Axis.Vertical排列方向,如果listDirection属性设置为Axis.Horizontal,会导致显示混乱;List属性alignListItem默认为ListItemAlign.Center,居中对齐显示。 |
224
225## ListItemStyle<sup>10+</sup>枚举说明
226
227List组件卡片样式枚举。
228
229**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
230
231**系统能力:** SystemCapability.ArkUI.ArkUI.Full
232
233| 名称 | 值  | 说明             |
234| ---- | ---- | ------------------ |
235| NONE | 0 | 无样式。           |
236| CARD | 1 | 显示默认卡片样式。 |
237
238## SwipeActionState<sup>11+</sup>枚举说明
239
240列表项滑动状态枚举。
241
242**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
243
244**系统能力:** SystemCapability.ArkUI.ArkUI.Full
245
246| 名称      | 值     | 说明                                                       |
247| --------- | --------- | ------------------------------------------------------------ |
248| COLLAPSED | 0 | 收起状态,当ListItem向左或向右滑动(当列表方向为“垂直”时),<br/>向上或向下滑动(当列方向为“水平”时)时操作项处于隐藏状态。 |
249| EXPANDED  | 1 | 展开状态,当ListItem向左或向右滑动(当列表方向为“垂直”时),<br/>向上或向下滑动(当列方向为“水平”时)时操作项处于显示状态。<br/>**说明:**<br/>需要ListItem设置向左或向右滑动(当列表方向为“垂直”时),<br/>向上或向下滑动(当列方向为“水平”时)时显示的操作项。 |
250| ACTIONING | 2 | 长距离状态,当ListItem进入长距删除区后删除ListItem的状态。<br/>**说明**:<br/>滑动后松手的位置超过或等于设置的距离阈值,并且设置的距离阈值有效时才能进入该状态。 |
251
252## 事件
253
254### onSelect<sup>8+</sup>
255
256onSelect(event:&nbsp;(isSelected:&nbsp;boolean)&nbsp;=&gt;&nbsp;void)
257
258ListItem元素被鼠标框选的状态改变时触发回调。
259
260**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
261
262**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
263
264**系统能力:** SystemCapability.ArkUI.ArkUI.Full
265
266**参数:**
267
268| 参数名     | 类型    | 必填 | 说明                                                         |
269| ---------- | ------- | ---- | ------------------------------------------------------------ |
270| isSelected | boolean | 是   | 进入鼠标框选范围即被选中返回true,&nbsp;移出鼠标框选范围即未被选中返回false。 |
271
272## 示例
273
274### 示例1(创建ListItem)
275该实例实现了创建ListItem的基本用法。
276
277```ts
278// xxx.ets
279@Entry
280@Component
281struct ListItemExample {
282  private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
283
284  build() {
285    Column() {
286      List({ space: 20, initialIndex: 0 }) {
287        ForEach(this.arr, (item: number) => {
288          ListItem() {
289            Text('' + item)
290              .width('100%')
291              .height(100)
292              .fontSize(16)
293              .textAlign(TextAlign.Center)
294              .borderRadius(10)
295              .backgroundColor(0xFFFFFF)
296          }
297        }, (item: string) => item)
298      }.width('90%')
299      .scrollBar(BarState.Off)
300    }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 })
301  }
302}
303```
304
305![zh-cn_image_0000001219864159](figures/zh-cn_image_0000001219864159.gif)
306
307### 示例2(设置划出组件)
308该示例展示了ListItem设置了swipeAction的横滑效果。
309
310```ts
311// xxx.ets
312@Entry
313@Component
314struct ListItemExample2 {
315  @State arr: number[] = [0, 1, 2, 3, 4]
316  @State enterEndDeleteAreaString: string = "not enterEndDeleteArea"
317  @State exitEndDeleteAreaString: string = "not exitEndDeleteArea"
318  private scroller: ListScroller = new ListScroller()
319
320  @Builder itemEnd() {
321    Row() {
322      Button("Delete").margin("4vp")
323      Button("Set").margin("4vp").onClick(() => {
324        this.scroller.closeAllSwipeActions()
325      })
326    }.padding("4vp").justifyContent(FlexAlign.SpaceEvenly)
327  }
328
329  build() {
330    Column() {
331      List({ space: 10, scroller: this.scroller }) {
332        ForEach(this.arr, (item: number) => {
333          ListItem() {
334            Text("item" + item)
335              .width('100%')
336              .height(100)
337              .fontSize(16)
338              .textAlign(TextAlign.Center)
339              .borderRadius(10)
340              .backgroundColor(0xFFFFFF)
341          }
342          .transition({ type: TransitionType.Delete, opacity: 0 })
343          .swipeAction({
344            end: {
345              builder: () => { this.itemEnd() },
346              onAction: () => {
347                this.getUIContext()?.animateTo({ duration: 1000 }, () => {
348                  let index = this.arr.indexOf(item)
349                  this.arr.splice(index, 1)
350                })
351              },
352              actionAreaDistance: 56,
353              onEnterActionArea: () => {
354                this.enterEndDeleteAreaString = "enterEndDeleteArea"
355                this.exitEndDeleteAreaString = "not exitEndDeleteArea"
356              },
357              onExitActionArea: () => {
358                this.enterEndDeleteAreaString = "not enterEndDeleteArea"
359                this.exitEndDeleteAreaString = "exitEndDeleteArea"
360              }
361            }
362          })
363        }, (item: string) => item)
364      }
365      Text(this.enterEndDeleteAreaString).fontSize(20)
366      Text(this.exitEndDeleteAreaString).fontSize(20)
367    }
368    .padding(10)
369    .backgroundColor(0xDCDCDC)
370    .width('100%')
371    .height('100%')
372  }
373}
374```
375![deleteListItem](figures/deleteListItem.gif)
376
377### 示例3(设置卡片样式)
378该示例展示了ListItem的卡片样式效果。
379
380```ts
381// xxx.ets
382@Entry
383@Component
384struct ListItemExample3 {
385  build() {
386    Column() {
387      List({ space: "4vp", initialIndex: 0 }) {
388        ListItemGroup({ style: ListItemGroupStyle.CARD }) {
389          ForEach([ListItemStyle.CARD, ListItemStyle.CARD, ListItemStyle.NONE], (itemStyle: number, index?: number) => {
390            ListItem({ style: itemStyle }) {
391              Text("" + index)
392                .width("100%")
393                .textAlign(TextAlign.Center)
394            }
395          })
396        }
397        ForEach([ListItemStyle.CARD, ListItemStyle.CARD, ListItemStyle.NONE], (itemStyle: number, index?: number) => {
398          ListItem({ style: itemStyle }) {
399            Text("" + index)
400              .width("100%")
401              .textAlign(TextAlign.Center)
402          }
403        })
404      }
405      .width('100%')
406      .multiSelectable(true)
407      .backgroundColor(0xDCDCDC)
408    }
409    .width('100%')
410    .padding({ top: 5 })
411  }
412}
413```
414![ListItemStyle](figures/listItem3.jpeg)
415
416### 示例4(通过ComponentContent设置划出组件)
417
418该示例通过ComponentContent设置ListItem中的划出组件操作时显示的操作项。
419
420```ts
421// xxx.ets
422import { ComponentContent } from '@kit.ArkUI';
423
424class BuilderParams {
425  text: string | Resource;
426  scroller: ListScroller
427  constructor(text: string | Resource, scroller: ListScroller) {
428    this.text = text;
429    this.scroller = scroller;
430  }
431}
432
433@Builder
434function itemBuilder(params: BuilderParams) {
435  Row() {
436    Button(params.text).margin("4vp")
437    Button("Set").margin("4vp").onClick(() => {
438      params.scroller.closeAllSwipeActions()
439    })
440  }.padding("4vp").justifyContent(FlexAlign.SpaceEvenly)
441}
442@Component
443struct MyListItem {
444  scroller: ListScroller = new ListScroller()
445  @State arr: number[] = [0, 1, 2, 3, 4]
446  @State project ?: number = 0
447  startBuilder ?: ComponentContent<BuilderParams> = undefined
448  endBuilder ?: ComponentContent<BuilderParams> = undefined
449
450  builderParam = new BuilderParams("delete", this.scroller)
451
452  aboutToAppear(): void {
453    this.startBuilder = new ComponentContent(this.getUIContext(), wrapBuilder(itemBuilder), this.builderParam)
454    this.endBuilder = new ComponentContent(this.getUIContext(), wrapBuilder(itemBuilder), this.builderParam)
455  }
456  GetStartBuilder() {
457    this.startBuilder?.update(new BuilderParams("StartDelete", this.scroller));
458    return this.startBuilder;
459  }
460  GetEndBuilder() {
461    this.endBuilder?.update(new BuilderParams("EndDelete", this.scroller));
462    return this.endBuilder;
463  }
464  build() {
465    ListItem() {
466      Text("item" + this.project)
467        .width('100%')
468        .height(100)
469        .fontSize(16)
470        .textAlign(TextAlign.Center)
471        .borderRadius(10)
472        .backgroundColor(0xFFFFFF)
473    }
474    .transition({ type: TransitionType.Delete, opacity: 0 })
475    .swipeAction({
476      end: {
477        builderComponent: this.GetEndBuilder(),
478        onAction: () => {
479          this.getUIContext()?.animateTo({ duration: 1000 }, () => {
480            let index = this.arr.indexOf(this.project)
481            this.arr.splice(index, 1)
482          })
483        },
484        actionAreaDistance: 56
485      },
486      start: {
487        builderComponent: this.GetStartBuilder(),
488        onAction: () => {
489          this.getUIContext()?.animateTo({ duration: 1000 }, () => {
490            let index = this.arr.indexOf(this.project)
491            this.arr.splice(index, 1)
492          })
493        },
494        actionAreaDistance: 56
495      }
496    })
497    .padding(5)
498  }
499}
500
501@Entry
502@Component
503struct ListItemExample {
504  @State arr: number[] = [0, 1, 2, 3, 4]
505  private scroller: ListScroller = new ListScroller()
506
507  build() {
508    Column() {
509      List({ space: 10, scroller: this.scroller }) {
510        ListItemGroup() {
511          ForEach(this.arr, (project: number) => {
512            MyListItem({ scroller: this.scroller, project: project, arr:this.arr })
513          }, (item: string) => item)
514        }
515      }
516    }
517    .padding(10)
518    .backgroundColor(0xDCDCDC)
519    .width('100%')
520    .height('100%')
521  }
522}
523```
524![ListItemStyle](figures/deleteListItem_example04.gif)