HarmonyOS List组件,数据源数组在头部插入多个数据(即在index = 0处插入),如何保持List在当前显示item处

list滑动到头部要加载更多历史消息,在数据源头部插入消息数据,刷新后要保持在当前显示消息处。现在是直接跳到新增数据源的头部。

HarmonyOS
1天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
aquaa

示例参考如下:

import { DataModel } from './DataModel';
import LazyDataSource from './LazyDataSource';

@Entry
@Component
struct Index {
  @State message: string = 'Hello World1';
  scroller: Scroller = new Scroller()
  dataSource: LazyDataSource<DataModel> = new LazyDataSource()
  count: number = 0
  @State currentIndex:number=0
  aboutToAppear(): void {
    for (let i = 0; i < 20; i++) {
      let model = new DataModel()
      model.data = `这是初始化的第${i}个数据`
      model.id = `${i}`
      this.dataSource.pushData(model, false)
    }
    this.dataSource.notifyDataReload()
  }

  build() {
    Column() {
      this.getListView()
      Button() {
        Text('头部插入数据')
      }.onClick(() => {
        let tmp=this.dataSource.getData(this.currentIndex)
        this.count += 1
        for (let i = 0; i < 20; i++) {
          let model = new DataModel()
          model.data = `这是第${this.count}次插入的的第${i}个数据`
          model.id = `${i}${this.count}`
          this.dataSource.addData(0, model, false)
        }
        this.dataSource.notifyDataReload()
        this.currentIndex=this.dataSource.indexOf(tmp) ////找到增加数据前的item的位置
        this.scroller.scrollToIndex(this.currentIndex)////将滑动条滑到对应位置
      })
        .width(100)
        .height(100)
    }
  }

  @Builder
  private getListView() {
    List({ scroller: this.scroller, space: 16 }) {
      LazyForEach(this.dataSource, (item: DataModel, index: number) => {
        ListItem() {
          Row() {
            Text(item.data)
          }
          .margin({left : 16})
          .padding({left: 8, right: 8, top: 8, bottom: 8})
          .backgroundColor(Color.White)
          .borderRadius(8)
          .backgroundColor('#A9E67B')
        }
        .height(100)
      }, (item: DataModel, index: number) => item.id)
    }
    .onScrollIndex((start: number, end: number, center: number) => {
      this.currentIndex = start//记录当前滑动条所对应的item位置
    })

    .edgeEffect(EdgeEffect.Spring, {alwaysEnabled: true})
    .width('100%')
    .cachedCount(5)
    .scrollBar(BarState.Auto)
    .contentStartOffset(8)
    .contentStartOffset(8)
    .layoutWeight(1)
  }
}
分享
微博
QQ
微信
回复
1天前
相关问题
SQL插入个数据时,如何获取ID?
3067浏览 • 2回复 待解决
postgresql 如何插入含 ‘ 数据
3834浏览 • 2回复 待解决
HarmonyOS list组件数据显示错乱
54浏览 • 1回复 待解决
HarmonyOS List数据显示
30浏览 • 1回复 待解决
HarmonyOS 数据库dataORM插入数据失败
277浏览 • 1回复 待解决
lazyforeach替换数据源解决方案
739浏览 • 1回复 待解决
多个数据库,同步数据
1925浏览 • 1回复 待解决
HarmonyOS 关系型数据库批量插入数据
376浏览 • 1回复 待解决
如何将easymock的数据插入数据库?
2452浏览 • 1回复 待解决