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 \| [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) \| [SwipeActionItem](#swipeactionitem10对象说明) | 否 | ListItem向右划动时item左边的组件(List垂直布局时)或ListItem向下划动时item上方的组件(List水平布局时)。 <br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 | 193| end | [CustomBuilder](ts-types.md#custombuilder8) \| [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: (isSelected: boolean) => 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, 移出鼠标框选范围即未被选中返回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 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 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 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