HarmonyOS 鸿蒙Next 如何在list组件搜索文本,其item为text控件,text控件长度可能会超出一屏幕

发布于 1周前 作者 sinazl 来自 鸿蒙OS

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

3 回复

文本部分可以使用属性字符串,来绘制自定义绘制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

基本信息

在HarmonyOS鸿蒙Next系统中,若想在list组件中搜索文本,且list的item为text控件,且text控件的长度可能超出屏幕,可以通过以下方式实现:

  1. 文本提取:首先,遍历list中的所有item,提取每个text控件中的文本内容。由于text控件长度可能超出屏幕,需要确保提取的是完整文本,可以通过控件的文本属性直接获取。

  2. 搜索匹配:将用户输入的搜索关键词与提取的文本内容进行匹配。可以使用字符串匹配算法,如KMP(Knuth-Morris-Pratt)或BM(Boyer-Moore)等高效算法来提高搜索效率。

  3. 高亮显示:对于匹配到的item,可以在text控件中高亮显示搜索关键词,以便用户快速定位。这可以通过修改text控件的样式或使用富文本控件来实现。

  4. 刷新列表:根据搜索结果,刷新list组件的显示,只展示匹配到的item,或者将匹配到的item置于列表顶部。

请注意,以上操作可能涉及UI更新和性能优化,确保在操作过程中不会造成界面卡顿或内存泄漏。

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

回到顶部