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 10## 子组件 11 12可以包含单个子组件。 13 14## 接口 15 16从API version 9开始,该接口支持在ArkTS卡片中使用。 17 18### ListItem<sup>10+</sup> 19 20ListItem(value?: ListItemOptions) 21 22**参数:** 23 24| 参数名 | 参数类型 | 必填 | 参数描述 | 25| ------ | --------------------------------------------- | ---- | ------------------------------------------------------------ | 26| value | [ListItemOptions](#listitemoptions10对象说明) | 否 | 为ListItem提供可选参数, 该对象内含有ListItemStyle枚举类型的style参数。 | 27 28### ListItem<sup>(deprecated)</sup> 29 30ListItem(value?: string) 31 32从API version 10开始, 该接口不再维护,推荐使用[ListItem<sup>10+</sup>](#listitem10)。 33 34**参数:** 35 36| 参数名 | 参数类型 | 必填 | 参数描述 | 37| ------ | ----------------------------- | ---- | -------- | 38| value | string | 否 | 无 | 39 40## 属性 41 42除支持[通用属性](ts-universal-attributes-size.md)外,还支持以下属性: 43 44| 名称 | 参数类型 | 描述 | 45| -------- | -------- | -------- | 46| sticky<sup>(deprecated)</sup> | [Sticky](#stickydeprecated枚举说明) | 设置ListItem吸顶效果。<br/>默认值:Sticky.None<br/>从API version9开始废弃不再使用,推荐使用[List组件sticky属性](ts-container-list.md#属性)。 | 47| editable<sup>(deprecated)</sup> | boolean \| [EditMode](#editmodedeprecated枚举说明) | 当前ListItem元素是否可编辑,进入编辑模式后可删除或移动列表项。<br/>从API version9开始废弃不再使用,无替代接口。<br/>默认值:false | 48| selectable<sup>8+</sup> | boolean | 当前ListItem元素是否可以被鼠标框选。<br/>**说明:**<br/>外层List容器的鼠标框选开启时,ListItem的框选才生效。<br/>默认值:true | 49| selected<sup>10+</sup> | boolean | 设置当前ListItem选中状态。该属性支持[$$](../../../quick-start/arkts-two-way-sync.md)双向绑定变量。<br/>**说明:**<br/>该属性需要在设置[选中态样式](./ts-universal-attributes-polymorphic-style.md)前使用才能生效选中态样式。<br/>默认值:false| 50| swipeAction<sup>9+</sup> | {<br/>start?: [CustomBuilder](ts-types.md#custombuilder8) \| [SwipeActionItem](#swipeactionitem10对象说明),<br/>end?:[CustomBuilder](ts-types.md#custombuilder8) \| [SwipeActionItem](#swipeactionitem10对象说明),<br/>edgeEffect?: [SwipeEdgeEffect](#swipeedgeeffect9枚举说明),<br/>} | 用于设置ListItem的划出组件。<br/>- start: ListItem向右划动时item左边的组件(List垂直布局时)或ListItem向下划动时item上方的组件(List水平布局时)。<br/>- end: ListItem向左划动时item右边的组件(List垂直布局时)或ListItem向上划动时item下方的组件(List水平布局时)。<br/>- edgeEffect: 滑动效果。<br/>**说明:** <br/>- start和end对应的@builder函数中顶层必须是单个组件,不能是if/else、ForEach、LazyForEach语句。<br/> - 滑动手势只在listItem区域上,如果子组件划出ListItem区域外,在ListItem以外部分不会响应划动手势。所以在多列模式下,建议不要将划出组件设置太宽。 | 51 52## Sticky<sup>(deprecated)</sup>枚举说明 53从API version9开始废弃不再使用,推荐使用[List组件stickyStyle枚举](ts-container-list.md#stickystyle9枚举说明)。 54| 名称 | 枚举值 | 描述 | 55| -------- | -------- | -------- | 56| None | 0 | 无吸顶效果。 | 57| Normal | 1 | 当前item吸顶。 | 58| Opacity | 2 | 当前item吸顶显示透明度变化效果。 | 59 60## EditMode<sup>(deprecated)</sup>枚举说明 61从API version9开始废弃不再使用,无替代接口。 62| 名称 | 枚举值 | 描述 | 63| ------ | ------ | --------- | 64| None | 0 | 编辑操作不限制。 | 65| Deletable | 1 | 可删除。 | 66| Movable | 2 | 可移动。 | 67 68## SwipeEdgeEffect<sup>9+</sup>枚举说明 69| 名称 | 枚举值 | 描述 | 70| ------ | ------ | --------- | 71| Spring | 0 | ListItem划动距离超过划出组件大小后可以继续划动。<br>如果设置了删除区域,ListItem划动距离超过删除阈值后可以继续划动,<br/>松手后按照弹簧阻尼曲线回弹。 | 72| None | 1 | ListItem划动距离不能超过划出组件大小。<br>如果设置了删除区域,ListItem划动距离不能超过删除阈值,<br/>并且在设置删除回调的情况下,达到删除阈值后松手触发删除回调。 | 73 74## SwipeActionItem<sup>10+</sup>对象说明 75List垂直布局,ListItem向右滑动,item左边的长距离滑动删除选项或向左滑动时,item右边的长距离滑动删除选项。 76</br>List水平布局,ListItem向上滑动,item下边的长距离滑动删除选项或向下滑动时,item上边的长距离滑动删除选项。 77 78| 名称 | 参数类型 | 必填 | 描述 | 79| -------------------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ | 80| actionAreaDistance | [Length](ts-types.md#length) | 否 | 设置组件长距离滑动删除距离阈值。<br/>默认值:56vp <br/>**说明:** <br/>不支持设置百分比。<br/>删除距离阈值大于item宽度减去划出组件宽度,或删除距离阈值小于等于0就不会设置删除区域。| 81| onAction | () => void | 否 | 组件进入长距删除区后删除ListItem时调用,进入长距删除区后抬手时触发。<br/>**说明:** <br/> 滑动后松手的位置超过或等于设置的距离阈值,并且设置的距离阈值有效时才会触发。| 82| onEnterActionArea | () => void | 否 | 在滑动条目进入删除区域时调用,只触发一次,当再次进入时仍触发。 | 83| onExitActionArea | () => void | 否 |当滑动条目退出删除区域时调用,只触发一次,当再次退出时仍触发。 | 84| builder | [CustomBuilder](ts-types.md#custombuilder8) | 否 |当列表项向左或向右滑动(当列表方向为“垂直”时),向上或向下滑动(当列方向为“水平”时)时显示的操作项。 | 85| onStateChange<sup>11+</sup> | (swipeActionState) => void | 否 |当列表项滑动状态变化时候触发。 | 86## ListItemOptions<sup>10+</sup>对象说明 87 88| 名称 | 参数类型 | 必填 | 描述 | 89| ----- | ----------------------------------------- | ---- | ------------------------------------------------------------ | 90| style | [ListItemStyle](#listitemstyle10枚举说明) | 否 | 设置List组件卡片样式。<br/>默认值: ListItemStyle.NONE<br/>设置为ListItemStyle.NONE时无样式。<br/>设置为ListItemStyle.CARD时,必须配合[ListItemGroup](ts-container-listitemgroup.md)的ListItemGroupStyle.CARD同时使用,显示默认卡片样式。 <br/>卡片样式下,ListItem默认规格:高度48vp,宽度100%。<br/>卡片样式下, 为卡片内的列表选项提供了默认的focus、hover、press、selected和disable样式。<br/>**说明:**<br/>当前卡片模式下,不支持listDirection属性设置,使用默认Axis.Vertical排列方向。<br/>当前卡片模式下,List属性alignListItem默认为ListItemAlign.Center,居中对齐显示。<br/>若仅设置ListItemStyle.CARD,未设置ListItemGroupStyle.CARD时,只显示部分卡片样式及功能。 | 91 92## SwipeActionOptions<sup>10+</sup>对象说明 93 94| 名称 | 参数类型 | 必填 | 描述 | 95| ---------------------------- | ------------------------ | ---- | ------------------------------------------------------------ | 96| onOffsetChange<sup>11+</sup> | (offset: number) => void | 否 | 当列表项向左或向右滑动(当列表方向为“垂直”时),向上或向下滑动(当列方向为“水平”时)位置发生变化触发,以vp为单位 | 97 98## ListItemStyle<sup>10+</sup>枚举说明 99 100| 名称 | 枚举值 | 描述 | 101| ---- | ---- | ------------------ | 102| NONE | 0 | 无样式。 | 103| CARD | 1 | 显示默认卡片样式。 | 104 105## SwipeActionState<sup>11+</sup>枚举说明 106 107| 名称 | 枚举值 | 描述 | 108| --------- | --------- | ------------------------------------------------------------ | 109| COLLAPSED | 0 | 收起状态,当ListItem向左或向右滑动(当列表方向为“垂直”时),<br/>向上或向下滑动(当列方向为“水平”时)时操作项处于隐藏状态。 | 110| EXPANDED | 1 | 展开状态,当ListItem向左或向右滑动(当列表方向为“垂直”时),<br/>向上或向下滑动(当列方向为“水平”时)时操作项处于显示状态。<br/>**说明:**<br/>需要ListItem设置向左或向右滑动(当列表方向为“垂直”时),<br/>向上或向下滑动(当列方向为“水平”时)时显示的操作项。 | 111| ACTIONING | 2 | 长距离状态,当ListItem进入长距删除区后删除ListItem的状态。<br/>**说明**:<br/>滑动后松手的位置超过或等于设置的距离阈值,并且设置的距离阈值有效时才能进入该状态。 | 112 113## 事件 114 115| 名称 | 功能描述 | 116| -------- | -------- | 117| onSelect(event: (isSelected: boolean) => void)<sup>8+</sup> | ListItem元素被鼠标框选的状态改变时触发回调。<br/>isSelected:进入鼠标框选范围即被选中返回true, 移出鼠标框选范围即未被选中返回false。 | 118 119## 示例 120 121### 示例1 122 123```ts 124// xxx.ets 125@Entry 126@Component 127struct ListItemExample { 128 private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 129 130 build() { 131 Column() { 132 List({ space: 20, initialIndex: 0 }) { 133 ForEach(this.arr, (item: number) => { 134 ListItem() { 135 Text('' + item) 136 .width('100%') 137 .height(100) 138 .fontSize(16) 139 .textAlign(TextAlign.Center) 140 .borderRadius(10) 141 .backgroundColor(0xFFFFFF) 142 } 143 }, (item: string) => item) 144 }.width('90%') 145 .scrollBar(BarState.Off) 146 }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 }) 147 } 148} 149``` 150 151 152 153### 示例2 154 155 156```ts 157// xxx.ets 158@Entry 159@Component 160struct ListItemExample2 { 161 @State arr: number[] = [0, 1, 2, 3, 4] 162 @State enterEndDeleteAreaString: string = "not enterEndDeleteArea" 163 @State exitEndDeleteAreaString: string = "not exitEndDeleteArea" 164 165 @Builder itemEnd() { 166 Row() { 167 Button("Delete").margin("4vp") 168 Button("Set").margin("4vp") 169 }.padding("4vp").justifyContent(FlexAlign.SpaceEvenly) 170 } 171 172 build() { 173 Column() { 174 List({ space: 10 }) { 175 ForEach(this.arr, (item: number) => { 176 ListItem() { 177 Text("item" + item) 178 .width('100%') 179 .height(100) 180 .fontSize(16) 181 .textAlign(TextAlign.Center) 182 .borderRadius(10) 183 .backgroundColor(0xFFFFFF) 184 } 185 .transition({ type: TransitionType.Delete, opacity: 0 }) 186 .swipeAction({ 187 end: { 188 builder: () => { this.itemEnd() }, 189 onAction: () => { 190 animateTo({ duration: 1000 }, () => { 191 let index = this.arr.indexOf(item) 192 this.arr.splice(index, 1) 193 }) 194 }, 195 actionAreaDistance: 56, 196 onEnterActionArea: () => { 197 this.enterEndDeleteAreaString = "enterEndDeleteArea" 198 this.exitEndDeleteAreaString = "not exitEndDeleteArea" 199 }, 200 onExitActionArea: () => { 201 this.enterEndDeleteAreaString = "not enterEndDeleteArea" 202 this.exitEndDeleteAreaString = "exitEndDeleteArea" 203 } 204 } 205 }) 206 }, (item: string) => item) 207 } 208 Text(this.enterEndDeleteAreaString).fontSize(20) 209 Text(this.exitEndDeleteAreaString).fontSize(20) 210 } 211 .padding(10) 212 .backgroundColor(0xDCDCDC) 213 .width('100%') 214 .height('100%') 215 } 216} 217``` 218 219 220### 示例3 221 222```ts 223// xxx.ets 224@Entry 225@Component 226struct ListItemExample3 { 227 build() { 228 Column() { 229 List({ space: "4vp", initialIndex: 0 }) { 230 ListItemGroup({ style: ListItemGroupStyle.CARD }) { 231 ForEach([ListItemStyle.CARD, ListItemStyle.CARD, ListItemStyle.NONE], (itemStyle: number, index?: number) => { 232 ListItem({ style: itemStyle }) { 233 Text("" + index) 234 .width("100%") 235 .textAlign(TextAlign.Center) 236 } 237 }) 238 } 239 ForEach([ListItemStyle.CARD, ListItemStyle.CARD, ListItemStyle.NONE], (itemStyle: number, index?: number) => { 240 ListItem({ style: itemStyle }) { 241 Text("" + index) 242 .width("100%") 243 .textAlign(TextAlign.Center) 244 } 245 }) 246 } 247 .width('100%') 248 .multiSelectable(true) 249 .backgroundColor(0xDCDCDC) 250 } 251 .width('100%') 252 .padding({ top: 5 }) 253 } 254} 255``` 256