HarmonyOS 鸿蒙Next 如何在list组件搜索文本,其item为text控件,text控件长度可能会超出一屏幕
HarmonyOS 鸿蒙Next 如何在list组件搜索文本,其item为text控件,text控件长度可能会超出一屏幕
这是构建item的逻辑,目前需要实现搜索功能,即输入一个关键字,然后在列表里面去找,找到后调用scroller滑动定位过去。
目前滑动到指定的条目是可以实现的,但是由于文本高度会超出一屏幕,简单的滑动到目标item不一定能精准定位到搜索的关键字,还需要进一步获取这个关键字在item中的位置,比如像获取这个关键字在text中的位置。目前没有找到合适的API,text有管理类textController,内部有layoutManager字段,能获取关键字在text中的位置方法是getLineMetrics(lineNumber: number): LineMetrics;
这个方法需要传入行号,但没有其他api能获取到行号。但这可能不是最优解,能实现文本列表搜索文本精准定位文本的方案就可以。
下面是构建列表item的方法,文本部分由Span
组成:
@Builder
function builderSpeakerItem() {
ForEach(this.getList(),
(astTranslateSectionBean: AstTranslateSectionBean, sectionIndex: number) => {
ListItem() {
Column() {
Row() {
Row() {
Stack() {
Circle({ width: 14, height: 14 })
.fill(AstUtil.getColorByRl(astTranslateSectionBean.rl))
Text(astTranslateSectionBean.rlName.substring(0, 1))
.fontColor(AstUtil.getColorByRl(astTranslateSectionBean.rl))
.fontSize(14)
}
Text(astTranslateSectionBean.rlName).fontSize(14).fontColor('#ff5aa6ff')
.margin({ left: 5 })
}.margin({ left: 18 })
Row() {
Image($r('app.media.ast_section_time'))
.width(13).height(13).objectFit(ImageFit.Auto)
Text(astTranslateSectionBean.startTime)
.fontSize(12)
.fontColor('#969baf')
.margin({ left: 5 })
}.margin({ right: 20 })
}.width('100%')
.margin({ top: 7 })
.justifyContent(FlexAlign.SpaceBetween)
Text(undefined, { controller: this.textControllerList[sectionIndex] }) {
ForEach(astTranslateSectionBean.statementList?.convertToArray(),
(value: StatementPlayInfo, statementIndex: number) => {
if (this.curStatementIndex == statementIndex && this.curSectionIndex == sectionIndex) {
//高亮
Span(value.content).fontColor(this.highLightColor)
} else {
Span(value.content)
.onClick(() => {
this.curSectionIndex = sectionIndex
this.curStatementIndex = statementIndex
// this.curStatementPlayInfo = value
this.currentPlayPosition = value.start
this.viewModel?.startPlay(this.currentPlayPosition)
})
}
})
}
.constraintSize({ maxWidth: '100%' })
.width("100%")
.padding({
left: 6,
right: 6,
top: 6,
bottom: 6
})
.margin({
top: 3,
left: 20,
right: 20,
bottom: 10
})
.fontColor(this.normalColor)
.fontSize(this.textSize)
.border({
radius: {
topLeft: 0,
topRight: 10,
bottomLeft: 10,
bottomRight: 10
}
})
.backgroundColor('#f5f6f9')
}.width("100%")
.height('auto')
.alignItems(HorizontalAlign.Start)
}
})
}
更多关于HarmonyOS 鸿蒙Next 如何在list组件搜索文本,其item为text控件,text控件长度可能会超出一屏幕的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
文本部分可以使用属性字符串,来绘制自定义绘制Span
可以使用属性字符串进行设置高亮,参考 https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-styled-string-V5# 示例6设置自定义绘制span,对于关键字匹配部分设置不同的styledValue
对于位置的话可以参考 https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-styled-string-V5#ondraw 的参数drawInfo: CustomSpanDrawInfo,获取到lineTop(自定义绘制Span相对于Text组件的上边距),保存下来,切换的时候根据这个高度来实现滚动到指定的位置
更多关于HarmonyOS 鸿蒙Next 如何在list组件搜索文本,其item为text控件,text控件长度可能会超出一屏幕的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
姓名
John Doe
职位
Software Engineer
基本信息
- 邮箱
john.doe@example.com - 电话
(123) 456-7890 - 地址
1234 Code St, TestCity, USA
在HarmonyOS鸿蒙Next系统中,若想在list组件中搜索文本,且list的item为text控件,且text控件的长度可能超出屏幕,可以通过以下方式实现:
-
文本提取:首先,遍历list中的所有item,提取每个text控件中的文本内容。由于text控件长度可能超出屏幕,需要确保提取的是完整文本,可以通过控件的文本属性直接获取。
-
搜索匹配:将用户输入的搜索关键词与提取的文本内容进行匹配。可以使用字符串匹配算法,如KMP(Knuth-Morris-Pratt)或BM(Boyer-Moore)等高效算法来提高搜索效率。
-
高亮显示:对于匹配到的item,可以在text控件中高亮显示搜索关键词,以便用户快速定位。这可以通过修改text控件的样式或使用富文本控件来实现。
-
刷新列表:根据搜索结果,刷新list组件的显示,只展示匹配到的item,或者将匹配到的item置于列表顶部。
请注意,以上操作可能涉及UI更新和性能优化,确保在操作过程中不会造成界面卡顿或内存泄漏。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html,