HarmonyOS 鸿蒙Next关于List点击事件的设置和执行

HarmonyOS 鸿蒙Next关于List点击事件的设置和执行 为了实现以(以自定义的类为元素的数组)为数据源的列表的点击事件,我做了如下事情。

首先,我定义了一个类Attribution,以及它对应的列表项视图AttributionItem。

@ObservedV2
export default class Attribution {
  @Trace name: ResourceStr;
  @Trace content: ResourceStr;
  @Trace shortClickCallback: Function;
  @Trace longClickCallback: Function;

  constructor(name: ResourceStr, content: ResourceStr, shortClickCallback?: Function, longClickCallback?: Function) {
    this.name = name;
    this.content = content;
    this.shortClickCallback = shortClickCallback == undefined ? () => {
    } : shortClickCallback;
    this.longClickCallback = longClickCallback == undefined ? () => {
    } : longClickCallback;
  }

  public setName(name: ResourceStr): void {
    this.name = name;
  }

  public setContent(content: ResourceStr): void {
    this.content = content;
  }

  public setShortClickCallback(shortClickCallback: Function): void {
    this.shortClickCallback = shortClickCallback;
  }

  public setLongClickCallback(longClickCallback: Function): void {
    this.longClickCallback = longClickCallback;
  }

  public getName(): ResourceStr {
    return this.name;
  }

  public getContent(): ResourceStr {
    return this.content;
  }

  public getShortClickCallback(): Function {
    return this.shortClickCallback;
  }

  public getLongClickCallback(): Function {
    return this.longClickCallback;
  }
}

@ComponentV2
@Preview
export default struct AttributionItem {
  private static readonly TAG: string = 'AttributionItem';
  @Param @Require attribution: Attribution;
  @Param mBackgroundColor: Color = Color.Transparent;
  @Param mBorderRadius: number = 0;
  @Param mFontColor: ResourceColor = $r('sys.color.ohos_id_color_text_primary');
  @Param mFontSize: number = Constants.LIST_ITEM_CONTENT_SIZE;
  @Param mMargin: Margin = {
    top: 0,
    bottom: 0,
    left: 0,
    right: 0
  };

  build() {
    Row() {
      Row() {
        Text(this.attribution.getName())
          .fontColor(this.mFontColor)
          .fontSize(this.mFontSize)
          .fontWeight(FontWeight.Bold)
          .textAlign(TextAlign.Start)
          .textOverflow({ overflow: TextOverflow.Ellipsis })
          .layoutWeight(1)

        Text(this.attribution.getContent())
          .fontColor(this.mFontColor)
          .fontSize(this.mFontSize)
          .textAlign(TextAlign.End)
          .textOverflow({ overflow: TextOverflow.Ellipsis })
          .layoutWeight(1)
      }
      .margin(this.mMargin)
    }
    .justifyContent(FlexAlign.SpaceBetween)
    .backgroundColor(this.mBackgroundColor)
    .borderRadius(this.mBorderRadius)
    .onClick((event) => {
      hilog.info(Constants.HILOG_DOMAIN, AttributionItem.TAG, 'Clicked item.');
      hilog.info(Constants.HILOG_DOMAIN, AttributionItem.TAG, this.attribution.getShortClickCallback().toString())
      this.attribution.getShortClickCallback();
    })
    .gesture(LongPressGesture({ repeat: false })
      .onAction((event: GestureEvent) => {
        hilog.info(Constants.HILOG_DOMAIN, AttributionItem.TAG, 'Long click start.');
      })
      .onActionEnd((event: GestureEvent) => {
        hilog.info(Constants.HILOG_DOMAIN, AttributionItem.TAG, 'Long click end.');
        this.attribution.getLongClickCallback();
      }))
  }
}

其次,我定义了一个元素类型为Attribution的数组,并把它用作List的数据源:

@ComponentV2
export default struct SensorTabPage {
    @Local attributions: Array<Attribution> = [];
    
    List({ space: 10, initialIndex: 0 }) {
        if (this.attributions != null) {
          ForEach(this.attributions, (item: Attribution) => {
            if (item != null) {
              ListItem() {
                AttributionItem({
                  attribution: item
                })
              }
            }
          })
        }
      }
}

随后,我在代码中动态地向数组赋予了内容,并且设置了点击事件。赋予内容的方式就是使用new,这里不再赘述。设置点击事件的方式是调用数组中特定元素的setShortClickCallback()方法。

但是,点击列表项以后,点击事件并没有正确执行。

我的问题如下:

  1. 我的写法有什么错误?
  2. 对于动态设置List内容这个问题,有没有更好的实现方式?

更多关于HarmonyOS 鸿蒙Next关于List点击事件的设置和执行的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

你的写法思路没错,执行时少了一步,this.attribution.getShortClickCallback()只取到了click事件本身,是个function,没有执行,后面再加个()()才是执行

this.attribution.getShortClickCallback()   ×

this.attribution.getShortClickCallback()()   √

更多关于HarmonyOS 鸿蒙Next关于List点击事件的设置和执行的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


感谢🙏,

基本信息

  • 姓名: 张三
  • 年龄: 28
  • 职位: 软件工程师

技能

  • Java
  • Python
  • C++

需要动态定义点击事件的场景,感觉你的方案已经是最佳方案了

在HarmonyOS鸿蒙系统中,关于List点击事件的设置和执行,通常涉及到使用ArkUI框架进行界面开发。以下是如何在ArkUI(eTS,即Extensible TypeScript)中设置List点击事件的基本步骤:

  1. 创建List组件:在页面的XML布局文件中,使用<list>标签定义一个List组件,并绑定数据源。

  2. 定义数据源:在页面的JavaScript或TypeScript文件中,定义一个数组作为List的数据源。

  3. 设置点击事件监听:在List组件的@itemClick事件中,定义一个回调函数来处理点击事件。该函数会接收点击项的索引或数据作为参数。

  4. 执行点击事件逻辑:在点击事件回调函数中,根据传入的参数执行相应的逻辑,如跳转页面、显示Toast等。

示例代码如下:

// 页面布局文件(*.ets)
<list @itemClick="onItemClick">
    <list-item for="{{items}}" >
        {{$item}}
    </list-item>
</list>

// 页面逻辑文件(*.ts)
import { ref } from '@ohos.api';

@Entry
@Component
struct MyComponent {
    items = ref(['Item 1', 'Item 2', 'Item 3']);

    onItemClick(index: number) {
        console.log('Clicked item:', this.items.value[index]);
        // 执行点击后的逻辑,如跳转页面等
    }
}

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部