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()方法。
但是,点击列表项以后,点击事件并没有正确执行。
我的问题如下:
- 我的写法有什么错误?
- 对于动态设置List内容这个问题,有没有更好的实现方式?
更多关于HarmonyOS 鸿蒙Next关于List点击事件的设置和执行的实战教程也可以访问 https://www.itying.com/category-93-b0.html
你的写法思路没错,执行时少了一步,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点击事件的基本步骤:
-
创建List组件:在页面的XML布局文件中,使用
<list>
标签定义一个List组件,并绑定数据源。 -
定义数据源:在页面的JavaScript或TypeScript文件中,定义一个数组作为List的数据源。
-
设置点击事件监听:在List组件的
@itemClick
事件中,定义一个回调函数来处理点击事件。该函数会接收点击项的索引或数据作为参数。 -
执行点击事件逻辑:在点击事件回调函数中,根据传入的参数执行相应的逻辑,如跳转页面、显示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,