目录

ListItem

ListItem用于展示列表中的具体列表项,支持设置划出菜单、选中状态、鼠标框选和卡片样式等能力,必须配合List组件使用,适用于需要在列表中展示内容并对单个列表项进行交互操作(如滑动删除、选中标记)的场景。

  • 该组件从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
  • 该组件的父组件只能是List或者ListItemGroup。
  • 当ListItem配合LazyForEach使用时,ListItem的子组件在ListItem创建时一同创建。配合if/else、ForEach使用时,或父组件为List/ListItemGroup时,ListItem子组件在ListItem布局时创建。

子组件

可以包含单个子组件。

接口

[h2]ListItem10+

ListItem(value?: ListItemOptions)

创建ListItem组件。

卡片能力: 从API version 10开始,该接口支持在ArkTS卡片中使用。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

模型约束: 此接口仅可在Stage模型下使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名 类型 必填 说明
value ListItemOptions 否

为ListItem提供可选参数,该对象内含有ListItemStyle枚举类型的style参数。当需要设置卡片样式(ListItemStyle.CARD)时传入此参数,不传入时使用默认配置(无样式)。

默认值:{ style: ListItemStyle.NONE }

[h2]ListItem(deprecated)

ListItem(value?: string)

创建ListItem组件。

从API version 7开始支持,从API version 10开始废弃。建议使用ListItem10+替代。

卡片能力: 从API version 9开始,该接口支持在ArkTS卡片中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名 类型 必填 说明
value string 否 该参数已废弃,当前版本不生效,建议使用ListItem10+替代。

属性

除支持通用属性外,还支持以下属性:

[h2]sticky(deprecated)

sticky(value: Sticky)

设置ListItem吸顶效果。

从API version 7开始支持,从API version 9开始废弃。建议使用sticky替代。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名 类型 必填 说明
value Sticky 是

ListItem吸顶效果。

默认值:Sticky.None

[h2]editable(deprecated)

editable(value: boolean | EditMode)

设置当前ListItem元素是否可编辑,进入编辑模式后可删除或移动列表项。

从API version 7开始支持,从API version 9开始废弃。无替代接口。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名 类型 必填 说明
value boolean | EditMode 是

ListItem元素是否可编辑。设置为true时进入编辑模式,可删除或移动列表项;设置为false时不可编辑。设置为EditMode枚举值时,None表示编辑操作不限制,Deletable表示可删除,Movable表示可移动。

默认值:false

[h2]selectable8+

selectable(value: boolean)

设置当前ListItem元素是否可以被鼠标框选。外层List组件设置multiSelectable为true开启鼠标框选时,ListItem的框选才生效。

卡片能力: 从API version 9开始,该接口支持在ArkTS卡片中使用。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名 类型 必填 说明
value boolean 是

ListItem元素是否可以被鼠标框选。设置为true时可以被鼠标框选,设置为false时无法被鼠标框选。

默认值:true

说明: 外层List组件设置multiSelectable为true开启鼠标框选时,ListItem的框选才生效。

[h2]selected10+

selected(value: boolean)

设置当前ListItem选中状态。该属性支持$$双向绑定变量。该属性需要在设置多态样式前使用,才能使选中态样式生效。

卡片能力: 从API version 10开始,该接口支持在ArkTS卡片中使用。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

模型约束: 此接口仅可在Stage模型下使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名 类型 必填 说明
value boolean 是

当前ListItem选中状态。设置为true时为选中状态,设置为false时为默认状态。

默认值:false

说明: 需要在设置多态样式前使用,才能使选中态样式生效。

[h2]swipeAction9+

swipeAction(value: SwipeActionOptions)

用于设置ListItem的划出组件。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名 类型 必填 说明
value SwipeActionOptions 是 ListItem的划出组件配置,用于设置划出时显示的组件、滑动效果和滑动状态回调等。

Sticky(deprecated)枚举说明

ListItem吸顶效果枚举。

从API version 7开始支持,从API version 9开始废弃。建议使用List组件的StickyStyle替代。

系统能力: SystemCapability.ArkUI.ArkUI.Full

名称 值 说明
None 0 无吸顶效果。
Normal 1 当前item吸顶。
Opacity 2 当前item吸顶显示透明度变化效果。

EditMode(deprecated)枚举说明

ListItem元素编辑模式枚举。

从API version 7开始支持,从API version 9开始废弃。无替代接口。

系统能力: SystemCapability.ArkUI.ArkUI.Full

名称 值 说明
None 0 编辑操作不限制。
Deletable 1 可删除。
Movable 2 可移动。

SwipeEdgeEffect9+枚举说明

滑动效果枚举。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

名称 值 说明
Spring 0

ListItem滑动距离超过划出组件大小后可以继续滑动。

如果设置了删除区域,ListItem滑动距离超过删除阈值后可以继续滑动,

松手后按照弹簧阻尼曲线回弹。

None 1

ListItem滑动距离不能超过划出组件大小。

如果设置了删除区域,ListItem滑动距离不能超过删除阈值,

并且在设置删除回调的情况下,达到删除阈值后松手触发删除回调。

SwipeActionOptions9+对象说明

start和end对应的@builder函数中顶层必须是单个组件(如果顶层是if/else、ForEach等渲染控制语句,则必须保证其仅能生成单个组件),否则会引发未定义行为。

滑动手势只在ListItem区域上生效,如果子组件滑出ListItem区域外,在ListItem以外的部分不会响应滑动手势。所以在多列模式下,建议不要将划出组件宽度设置过大。

系统能力: SystemCapability.ArkUI.ArkUI.Full

名称 类型 只读 可选 说明
start CustomBuilder | SwipeActionItem 否 是

ListItem向右滑动时列表项左边的组件(List垂直布局时)或ListItem向下滑动时列表项上方的组件(List水平布局时)。

默认值:无(不设置时不显示该侧划出组件)

说明:

当取值为CustomBuilder或SwipeActionItem的builder时,@builder函数中顶层必须是单个组件,否则会引发未定义行为。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

end CustomBuilder | SwipeActionItem 否 是

ListItem向左滑动时列表项右边的组件(List垂直布局时)或ListItem向上滑动时列表项下方的组件(List水平布局时)。

默认值:无(不设置时不显示该侧划出组件)

说明:

当取值为CustomBuilder或SwipeActionItem的builder时,@builder函数中顶层必须是单个组件,否则会引发未定义行为。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

edgeEffect SwipeEdgeEffect 否 是

滑动效果。

默认值:SwipeEdgeEffect.Spring

SwipeEdgeEffect.Spring表示弹簧效果,滑动距离超过划出组件大小后可继续滑动并按弹簧阻尼曲线回弹;SwipeEdgeEffect.None表示无弹簧效果,滑动距离不能超过划出组件大小。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

onOffsetChange11+ (offset: number) => void 否 是

当列表项向左或向右滑动(当列表方向为“垂直”时),向上或向下滑动(当列表方向为“水平”时)位置发生变化触发,以vp为单位。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

模型约束: 此接口仅可在Stage模型下使用。

SwipeActionItem10+对象说明

SwipeActionItem用于配置SwipeActionOptions中的start或end划出项,包括划出时显示的操作项、长距离操作区域的距离阈值,以及进入、退出长距离操作区域、抬手触发操作和状态变化时的回调。

作为start划出项时,List为垂直布局时显示在ListItem左侧,List为水平布局时显示在ListItem上方;作为end划出项时,List为垂直布局时显示在ListItem右侧,List为水平布局时显示在ListItem下方。

模型约束: 此接口仅可在Stage模型下使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

名称 类型 只读 可选 说明
actionAreaDistance Length 否 是

设置组件长距离滑动删除距离阈值。即划出组件被完全滑进视窗(即可视区域)后,继续滑动触发删除的距离阈值。

默认值:56vp

说明:

不支持设置百分比。

删除距离阈值大于等于ListItem在滑动方向上的尺寸减去划出组件在滑动方向上的尺寸,或删除距离阈值小于等于0时,不会形成删除区域。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

onAction () => void 否 是

组件进入长距删除区后抬手时触发。

说明:

actionAreaDistance的最终取值大于0,且小于ListItem在滑动方向上的尺寸减去划出组件在滑动方向上的尺寸时,滑动后松手的位置超过或等于该取值才会触发回调;未设置actionAreaDistance时,按默认值56vp计算。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

onEnterActionArea () => void 否 是

在滑动列表项进入删除区域时调用,每次进入只触发一次。

说明:

actionAreaDistance的最终取值大于0,且小于ListItem在滑动方向上的尺寸减去划出组件在滑动方向上的尺寸时,进入该区域才会触发回调;未设置actionAreaDistance时,按默认值56vp计算。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

onExitActionArea () => void 否 是

当滑动列表项退出删除区域时调用,每次退出只触发一次。

说明:

actionAreaDistance的最终取值大于0,且小于ListItem在滑动方向上的尺寸减去划出组件在滑动方向上的尺寸时,退出该区域才会触发回调;未设置actionAreaDistance时,按默认值56vp计算。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

builder CustomBuilder 否 是

当列表项向左或向右滑动(当列表方向为“垂直”时),向上或向下滑动(当列表方向为“水平”时)时显示的操作项。

默认值:无(不设置时无操作项显示)

说明:

同时设置builderComponent时,builderComponent的优先级高于该参数。即同时设置builder和builderComponent时,以builderComponent设置的值为准。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

builderComponent18+ ComponentContent 否 是

当列表项向左或向右滑动(当列表方向为“垂直”时),向上或向下滑动(当列表方向为“水平”时)时显示的操作项。

默认值:无(不设置时无操作项显示)

说明:

该参数的优先级高于参数builder。即同时设置builder和builderComponent时,以builderComponent设置的值为准。

同一个builderComponent不推荐同时给不同的start/end使用,否则会导致显示问题。

元服务API: 从API version 18开始,该接口支持在元服务中使用。

onStateChange11+ (state:SwipeActionState) => void 否 是

当列表项滑动状态变化时触发。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

ListItemOptions10+对象说明

ListItem组件参数。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

模型约束: 此接口仅可在Stage模型下使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

名称 类型 只读 可选 说明
style ListItemStyle 否 是

设置ListItem组件卡片样式。

默认值:ListItemStyle.NONE

设置为ListItemStyle.NONE时无样式。

设置为ListItemStyle.CARD时,建议配合ListItemGroup的ListItemGroupStyle.CARD同时使用,显示默认卡片样式。

卡片样式下,ListItem默认规格:高度48vp,宽度100%,左右内边距8vp。如果需要实现ListItem高度自适应,可以把height设置为undefined。

卡片样式下,为卡片内的列表项提供了默认的focused、hovered、pressed、selected和disabled样式。

说明:

当设置为ListItemStyle.CARD时,List的listDirection属性值须为Axis.Vertical,如果设置为Axis.Horizontal,会导致显示混乱;List属性alignListItem默认为ListItemAlign.Center,居中对齐显示。

ListItemStyle10+枚举说明

ListItem组件卡片样式枚举。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

模型约束: 此接口仅可在Stage模型下使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

名称 值 说明
NONE 0 无样式。
CARD 1 显示默认卡片样式。

SwipeActionState11+枚举说明

列表项滑动状态枚举。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

模型约束: 此接口仅可在Stage模型下使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

名称 值 说明
COLLAPSED 0 收起状态,操作项处于隐藏状态。
EXPANDED 1

展开状态,操作项处于显示状态。

说明:

需要ListItem设置划出操作项。

ACTIONING 2

长距离状态,当ListItem进入长距删除区后删除ListItem的状态。

说明:

actionAreaDistance的最终取值大于0,且小于ListItem在滑动方向上的尺寸减去划出组件在滑动方向上的尺寸时,滑动后松手的位置超过或等于该取值才能进入该状态。

事件

[h2]onSelect8+

onSelect(event: (isSelected: boolean) => void)

ListItem元素被鼠标框选的状态改变时触发回调。

外层List组件设置multiSelectable为true开启鼠标框选,且当前ListItem的selectable属性为true时,触发该回调。

卡片能力: 从API version 9开始,该接口支持在ArkTS卡片中使用。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名 类型 必填 说明
isSelected boolean 是 进入鼠标框选范围即被选中返回true, 移出鼠标框选范围即未被选中返回false。

ListItemSwipeActionManager21+

ListItem划出菜单的管理器。

元服务API: 从API version 21开始,该接口支持在元服务中使用。

模型约束: 此接口仅可在Stage模型下使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

[h2]expand21+

expand(node: FrameNode, direction: ListItemSwipeActionDirection): void

展开指定ListItem的划出菜单。

  • 如果List组件cachedCount属性show参数设置为true,List显示区域外已预加载完成的ListItem支持展开,否则List显示区域外节点不支持展开。

元服务API: 从API version 21开始,该接口支持在元服务中使用。

模型约束: 此接口仅可在Stage模型下使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名 类型 必填 说明
node FrameNode 是 ListItem节点对象。
direction ListItemSwipeActionDirection 是 ListItem划出菜单的展开方向。

错误码:

以下错误码的详细介绍请参见自定义节点错误码。

错误码ID 错误信息
100023 The component type of the node is incorrect.
106203 The node not mounted to component tree.

[h2]collapse21+

collapse(node: FrameNode): void

收起指定ListItem的划出菜单。

元服务API: 从API version 21开始,该接口支持在元服务中使用。

模型约束: 此接口仅可在Stage模型下使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名 类型 必填 说明
node FrameNode 是 ListItem节点对象。

错误码:

以下错误码的详细介绍请参见自定义节点错误码。

错误码ID 错误信息
100023 The component type of the node is incorrect.
106203 The node not mounted to component tree.

ListItemSwipeActionDirection21+枚举说明

ListItem划出菜单的展开方向。

元服务API: 从API version 21开始,该接口支持在元服务中使用。

模型约束: 此接口仅可在Stage模型下使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

名称 值 说明
START 0 当列表方向是垂直方向时,LTR(Left-To-Right,从左到右)模式下表示ListItem的左边,RTL(Right-To-Left,从右到左)模式下表示ListItem的右边。当列表是水平方向时,表示ListItem的上边。
END 1 当列表方向是垂直方向时,LTR模式下表示ListItem的右边,RTL模式下表示ListItem的左边。当列表是水平方向时,表示ListItem的下边。

示例

[h2]示例1(创建ListItem)

该示例实现了创建ListItem的基本用法。

// xxx.ets
export class ListDataSource implements IDataSource {
  private list: number[] = [];

  constructor(list: number[]) {
    this.list = list;
  }

  totalCount(): number {
    return this.list.length;
  }

  getData(index: number): number {
    return this.list[index];
  }

  registerDataChangeListener(listener: DataChangeListener): void {
  }

  unregisterDataChangeListener(listener: DataChangeListener): void {
  }
}

@Entry
@Component
struct ListItemExample {
  private arr: ListDataSource = new ListDataSource([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);

  build() {
    Column() {
      List({ space: 20, initialIndex: 0 }) {
        LazyForEach(this.arr, (item: number) => {
          ListItem() {
            Text('' + item)
              .width('100%')
              .height(100)
              .fontSize(16)
              .textAlign(TextAlign.Center)
              .borderRadius(10)
              .backgroundColor(0xFFFFFF)
          }
        }, (item: number) => item.toString())
      }.width('90%')
      .scrollBar(BarState.Off)
    }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 })
  }
}

[h2]示例2(设置划出组件)

该示例展示了ListItem设置了swipeAction的横滑效果。

// xxx.ets
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct ListItemExample2 {
  @State arr: number[] = [0, 1, 2, 3, 4];
  @State enterEndDeleteAreaString: string = 'not enterEndDeleteArea';
  @State exitEndDeleteAreaString: string = 'not exitEndDeleteArea';
  private scroller: ListScroller = new ListScroller();

  @Builder
  itemEnd() {
    Row() {
      Button('Delete').margin(4)
      Button('Set').margin(4).onClick(() => {
        try {
          this.scroller.closeAllSwipeActions();
        } catch (error) {
          console.error(`Failed to close all swipe actions. Code: ${(error as BusinessError).code}, message: ${(error as BusinessError).message}`);
        }
      })
    }.padding(4).justifyContent(FlexAlign.SpaceEvenly)
  }

  build() {
    Column() {
      List({ space: 10, scroller: this.scroller }) {
        ForEach(this.arr, (item: number) => {
          ListItem() {
            Text('item' + item)
              .width('100%')
              .height(100)
              .fontSize(16)
              .textAlign(TextAlign.Center)
              .borderRadius(10)
              .backgroundColor(0xFFFFFF)
          }
          .transition(TransitionEffect.OPACITY)
          .swipeAction({
            end: {
              builder: () => {
                this.itemEnd()
              },
              onAction: () => {
                this.getUIContext()?.animateTo({ duration: 1000 }, () => {
                  let index = this.arr.indexOf(item);
                  this.arr.splice(index, 1);
                });
              },
              actionAreaDistance: 56,
              onEnterActionArea: () => {
                this.enterEndDeleteAreaString = 'enterEndDeleteArea';
                this.exitEndDeleteAreaString = 'not exitEndDeleteArea';
              },
              onExitActionArea: () => {
                this.enterEndDeleteAreaString = 'not enterEndDeleteArea';
                this.exitEndDeleteAreaString = 'exitEndDeleteArea';
              }
            }
          })
        }, (item: number) => item.toString())
      }

      Text(this.enterEndDeleteAreaString).fontSize(20)
      Text(this.exitEndDeleteAreaString).fontSize(20)
    }
    .padding(10)
    .backgroundColor(0xDCDCDC)
    .width('100%')
    .height('100%')
  }
}

[h2]示例3(设置卡片样式)

该示例展示了ListItem的卡片样式效果。

// xxx.ets
@Entry
@Component
struct ListItemExample3 {
  build() {
    Column() {
      List({ space: 4, initialIndex: 0 }) {
        ListItemGroup({ style: ListItemGroupStyle.CARD }) {
          ForEach([ListItemStyle.CARD, ListItemStyle.CARD, ListItemStyle.NONE], (itemStyle: ListItemStyle, index?: number) => {
            ListItem({ style: itemStyle }) {
              Text('' + index)
                .width('100%')
                .textAlign(TextAlign.Center)
            }
          })
        }

        ForEach([ListItemStyle.CARD, ListItemStyle.CARD, ListItemStyle.NONE], (itemStyle: ListItemStyle, index?: number) => {
          ListItem({ style: itemStyle }) {
            Text('' + index)
              .width('100%')
              .textAlign(TextAlign.Center)
          }
        })
      }
      .width('100%')
      .multiSelectable(true)
      .backgroundColor(0xDCDCDC)
    }
    .width('100%')
    .padding({ top: 5 })
  }
}

[h2]示例4(通过ComponentContent设置划出组件)

该示例通过ComponentContent设置ListItem划出组件时显示的操作项。

// xxx.ets
import { ComponentContent } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

class BuilderParams {
  text: string | Resource;
  scroller: ListScroller;

  constructor(text: string | Resource, scroller: ListScroller) {
    this.text = text;
    this.scroller = scroller;
  }
}

@Builder
function itemBuilder(params: BuilderParams) {
  Row() {
    Button(params.text).margin(4)
    Button('Set').margin(4).onClick(() => {
      try {
        params.scroller.closeAllSwipeActions();
      } catch (err) {
        let error: BusinessError = err as BusinessError;
        console.error(`closeAllSwipeActions failed, error code: ${error.code}, message: ${error.message}`);
      }
    })
  }.padding(4).justifyContent(FlexAlign.SpaceEvenly)
}

@Component
struct MyListItem {
  scroller: ListScroller = new ListScroller();
  @State arr: number[] = [0, 1, 2, 3, 4];
  @State project: number = 0;
  startBuilder ?: ComponentContent<BuilderParams> = undefined;
  endBuilder ?: ComponentContent<BuilderParams> = undefined;
  builderParam = new BuilderParams('delete', this.scroller);

  aboutToAppear(): void {
    this.startBuilder = new ComponentContent(this.getUIContext(), wrapBuilder(itemBuilder), this.builderParam);
    this.endBuilder = new ComponentContent(this.getUIContext(), wrapBuilder(itemBuilder), this.builderParam);
  }

  getStartBuilder() {
    this.startBuilder?.update(new BuilderParams('StartDelete', this.scroller));
    return this.startBuilder;
  }

  getEndBuilder() {
    this.endBuilder?.update(new BuilderParams('EndDelete', this.scroller));
    return this.endBuilder;
  }

  build() {
    ListItem() {
      Text('item' + this.project)
        .width('100%')
        .height(100)
        .fontSize(16)
        .textAlign(TextAlign.Center)
        .borderRadius(10)
        .backgroundColor(0xFFFFFF)
    }
    .transition(TransitionEffect.OPACITY)
    .swipeAction({
      end: {
        builderComponent: this.getEndBuilder(),
        onAction: () => {
          this.getUIContext()?.animateTo({ duration: 1000 }, () => {
            let index = this.arr.indexOf(this.project);
            this.arr.splice(index, 1);
          });
        },
        actionAreaDistance: 56
      },
      start: {
        builderComponent: this.getStartBuilder(),
        onAction: () => {
          this.getUIContext()?.animateTo({ duration: 1000 }, () => {
            let index = this.arr.indexOf(this.project);
            this.arr.splice(index, 1);
          });
        },
        actionAreaDistance: 56
      }
    })
    .padding(5)
  }
}

@Entry
@Component
struct ListItemExample {
  @State arr: number[] = [0, 1, 2, 3, 4];
  private scroller: ListScroller = new ListScroller();

  build() {
    Column() {
      List({ space: 10, scroller: this.scroller }) {
        ListItemGroup() {
          ForEach(this.arr, (project: number) => {
            MyListItem({ scroller: this.scroller, project: project, arr: this.arr })
          }, (item: number) => item.toString())
        }
      }
    }
    .padding(10)
    .backgroundColor(0xDCDCDC)
    .width('100%')
    .height('100%')
  }
}

[h2]示例5(通过ListItemSwipeActionManager管理划出菜单)

从API version 21开始,该示例通过ListItemSwipeActionManager管理ListItem的划出菜单。

// xxx.ets
import { BusinessError } from '@kit.BasicServicesKit';
import { FrameNode } from '@kit.ArkUI';

@Entry
@Component
struct ListItemExample5 {
  @Builder
  itemAction(str: string) {
    Row() {
      Button(str).margin(4)
    }.padding(4).justifyContent(FlexAlign.SpaceEvenly)
  }

  build() {
    Flex({ wrap: FlexWrap.Wrap }) {
      Flex({ wrap: FlexWrap.Wrap, justifyContent: FlexAlign.SpaceBetween }) {
        Button('expand start')
          .onClick(() => {
            try {
              let node: FrameNode | null = this.getUIContext().getAttachedFrameNodeById('listItem');
              if (!node) {
                return;
              }
              ListItemSwipeActionManager.expand(node, ListItemSwipeActionDirection.START);
            } catch (error) {
              console.error(`Error expand item. Code: ${(error as BusinessError).code}, message: ${(error as BusinessError).message}`);
            }
          })
        Button('expand end')
          .onClick(() => {
            try {
              let node: FrameNode | null = this.getUIContext().getAttachedFrameNodeById('listItem');
              if (!node) {
                return;
              }
              ListItemSwipeActionManager.expand(node, ListItemSwipeActionDirection.END);
            } catch (error) {
              console.error(`Error expand item. Code: ${(error as BusinessError).code}, message: ${(error as BusinessError).message}`);
            }
          })
        Button('collapse')
          .onClick(() => {
            try {
              let node: FrameNode | null = this.getUIContext().getAttachedFrameNodeById('listItem');
              if (!node) {
                return;
              }
              ListItemSwipeActionManager.collapse(node);
            } catch (error) {
              console.error(`Error collapse item. Code: ${(error as BusinessError).code}, message: ${(error as BusinessError).message}`);
            }
          })
      }
      .margin({ bottom: 10 })

      List({ space: 10 }) {
        ListItem() {
          Text('item')
            .width('100%')
            .height(100)
            .fontSize(16)
            .textAlign(TextAlign.Center)
            .borderRadius(10)
            .backgroundColor(0xFFFFFF)
        }
        .id('listItem')
        .transition(TransitionEffect.OPACITY)
        .swipeAction({
          start: {
            builder: () => {
              this.itemAction('start')
            },
          },
          end: {
            builder: () => {
              this.itemAction('end')
            },
          }
        })
      }
      .height('80%')

    }
    .padding(10)
    .backgroundColor(0xDCDCDC)
    .width('100%')
    .height('100%')
  }
}