HarmonyOS 鸿蒙Next List刷新问题

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

HarmonyOS 鸿蒙Next List刷新问题

修改数据源其中一个item的某一个属性 如何刷新数据,有大佬遇到过吗?

我在修改数据之后 用list[index] = item,list是数据源,index是修改的第几个,item是第index个的item,但是不管用, 有遇到这种问题的嘛???

8 回复

监测对象数组中对象的属性得用@Observed装饰器和@ObjectLink装饰器

楼主,我也遇到了你说的这个问题,能帮我看下我的代码吗?要怎么使用这个[@Watch](/user/Watch)呢。

 /**
   * 通过父节点获取的子节点数据集合
   */
  [@Prop](/user/Prop) [@Watch](/user/Watch)("ddd") nodeList: NodePersonEntity[] = []

ddd(propName: string) { this.build() }

build() { Column() { Row() { Checkbox({ name: “check_select_all” }) .shape(CheckBoxShape.CIRCLE) .onChange((value: boolean) => { console.info(‘Checkbox1 change is’ + value) }) Text($r(‘app.string.select_all’)).margin({ left: 12 }) }.padding({ left: 8, right: 8 }).alignSelf(ItemAlign.Start)

  List() {
    ForEach(<span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.nodeList, (item: NodePersonEntity, index: number) =&gt; {
      ListItem() {
        RelativeContainer() {
          Row() {
            Checkbox().shape(CheckBoxShape.CIRCLE).onChange((value: boolean) =&gt; {

            }).select(item.isSelected)
            Text(item.name.length &gt; <span class="hljs-number"><span class="hljs-number">2</span></span> ? item.name.substring(<span class="hljs-number"><span class="hljs-number">0</span></span>, <span class="hljs-number"><span class="hljs-number">2</span></span>) : item.name)
              .width(<span class="hljs-number"><span class="hljs-number">50</span></span>)
              .height(<span class="hljs-number"><span class="hljs-number">50</span></span>)
              .backgroundColor(<span class="hljs-string"><span class="hljs-string">'#ff4879e8'</span></span>)
              .fontColor(Color.White)
              .padding(<span class="hljs-number"><span class="hljs-number">12</span></span>)
              .borderRadius(<span class="hljs-number"><span class="hljs-number">100</span></span>)
              .fontSize(<span class="hljs-number"><span class="hljs-number">13</span></span>)
              .textAlign(TextAlign.Center)
              .margin({ left: <span class="hljs-number"><span class="hljs-number">12</span></span> })
            Text(item.name).margin({ left: <span class="hljs-number"><span class="hljs-number">12</span></span> })
          }
          .alignItems(VerticalAlign.Center)
          .alignRules({ center: { anchor: <span class="hljs-string"><span class="hljs-string">"__container__"</span></span>, align: VerticalAlign.Center } })

          Row() {
            Image($r(<span class="hljs-string"><span class="hljs-string">'app.media.icon_arrow_right'</span></span>))
              .width(<span class="hljs-number"><span class="hljs-number">32</span></span>)
              .height(<span class="hljs-number"><span class="hljs-number">32</span></span>)
              .objectFit(ImageFit.Contain)
              .padding(<span class="hljs-number"><span class="hljs-number">4</span></span>)
            Image($r(<span class="hljs-string"><span class="hljs-string">'app.media.icon_tongxunlu_nextnode'</span></span>)).width(<span class="hljs-number"><span class="hljs-number">32</span></span>).height(<span class="hljs-number"><span class="hljs-number">32</span></span>).objectFit(ImageFit.Contain)
            Text($r(<span class="hljs-string"><span class="hljs-string">'app.string.text_next_node'</span></span>))
          }
          .visibility(item.id.endsWith(<span class="hljs-string"><span class="hljs-string">"u"</span></span>) ? Visibility.None : Visibility.Visible)
          .alignItems(VerticalAlign.Center)
          .alignRules({
            right: { anchor: <span class="hljs-string"><span class="hljs-string">"__container__"</span></span>, align: HorizontalAlign.End },
            center: { anchor: <span class="hljs-string"><span class="hljs-string">"__container__"</span></span>, align: VerticalAlign.Center }
          })
          .padding({ left: <span class="hljs-number"><span class="hljs-number">8</span></span>, right: <span class="hljs-number"><span class="hljs-number">8</span></span> })
          .onClick(() =&gt; {
            <span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.context.eventHub.emit(EventHubConstant.SELECT_NODE_PERSON_NEXT_NODE, item)
          })
        }.width(<span class="hljs-string"><span class="hljs-string">'100%'</span></span>).height(<span class="hljs-number"><span class="hljs-number">60</span></span>).onClick(() =&gt; {
          item.isSelected = <span class="hljs-literal"><span class="hljs-literal">true</span></span>
          <span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.nodeList[index] = item
        })
      }.padding({ left: <span class="hljs-number"><span class="hljs-number">8</span></span>, right: <span class="hljs-number"><span class="hljs-number">8</span></span> })
    })
  }.margin({ top: <span class="hljs-number"><span class="hljs-number">12</span></span> })
}.padding({ top: <span class="hljs-number"><span class="hljs-number">8</span></span>, bottom: <span class="hljs-number"><span class="hljs-number">8</span></span> })

}<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

我在下面的onClick事件中修改了item的isSelected属性,然后想刷新整个列表显示。

或许可以:

List For循环的数据keyGenerator确认相同数据的.

每次更新item后,将对应item的keyGenerator返回值进行修改, 比如以item中id+updateTime为返回值.

请问解决了吗?

HarmonyOS 鸿蒙系统中遇到Next List(假设是某个特定组件或列表视图的引用)刷新问题,通常与数据更新未正确触发UI重绘有关。请检查以下几点:

  1. 确保数据源已正确更新。
  2. 使用合适的刷新机制,如notifyDataSetChanged()(如果是Adapter)或状态管理(如LiveData, ViewModel等)来触发UI更新。
  3. 检查是否在UI线程中更新UI,避免多线程问题。
  4. 查看是否有缓存或旧数据干扰了新数据的显示。

如果问题依旧没法解决请加我微信,我的微信是itying888。

回到顶部