HarmonyOS 如何做到在往列表前面插入数据的时候,列表位置保持不动

如何做到在往列表前面插入数据的时候,列表位置保持不动,保持锚点位置。聊天界面中用户滑动加载历史消息,但是拉回来消息肯定是插到前面,支持用户继续滑动。但是不改变用户当前所在位置。

HarmonyOS
2024-10-16 10:09:44
760浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
Heiang

可参考此demo:

// Basic implementation of IDataSource to handle data listener  
abstract class BasicDataSource<T> implements IDataSource {  
  private listeners: DataChangeListener[] = []  
  abstract totalCount(): number  
  abstract getData(index: number): T  
  registerDataChangeListener(listener: DataChangeListener): void {  
    if (this.listeners.indexOf(listener) < 0) {  
      console.info('add listener')  
      this.listeners.push(listener)  
    }  
  }  
  unregisterDataChangeListener(listener: DataChangeListener): void {  
    const pos = this.listeners.indexOf(listener);  
    if (pos >= 0) {  
      console.info('remove listener')  
      this.listeners.splice(pos, 1)  
    }  
  }  
  notifyDataReload(): void {  
    this.listeners.forEach(listener => {  
      listener.onDataReloaded()  
    })  
  }  
  notifyDataAdd(index: number): void {  
    this.listeners.forEach(listener => {  
      listener.onDataAdd(index)  
    })  
  }  
  notifyDataChange(index: number): void {  
    this.listeners.forEach(listener => {  
      listener.onDataChange(index)  
    })  
  }  
  notifyDataDelete(index: number): void {  
    this.listeners.forEach(listener => {  
      listener.onDataDelete(index)  
    })  
  }  
  notifyDataMove(from: number, to: number): void {  
    this.listeners.forEach(listener => {  
      listener.onDataMove(from, to)  
    })  
  }  
}  
export class MyDataSource<T> extends BasicDataSource<T> {  
  private dataArray: T[] = []  
  
  public totalCount(): number {  
    return this.dataArray.length  
  }  
  public getData(index: number): T {  
    console.log("zxy List cacheCountTest3 getData = " + index)  
    return this.dataArray[index]  
  }  
  public addData(index: number, data: T): void {  
    this.dataArray.splice(index, 0, data) // 在index位置增加data  
    this.notifyDataAdd(index)  
  }  
  public dataReload(): void {  
    this.notifyDataReload()  
  }  
  public pushData(data: T): void {  
    this.dataArray.push(data)  
    this.notifyDataAdd(this.dataArray.length - 1)  
  }  
  public deleteIndex(index: number): void {  
    this.dataArray.splice(index, 1) // 在index位置删除1个数据  
    this.notifyDataDelete(index)  
  }  
  public deleteData(data: T): void {  
    let index = this.dataArray.indexOf(data)  
    this.dataArray.splice(index, 1) // 在index位置删除1个数据  
    this.notifyDataDelete(index)  
  }  
  public moveData(from: number, to: number) {  
    this.notifyDataMove(from, to)  
  }  
  public changeData(index: number, data: T) {  
    this.dataArray[index] = data  
    this.notifyDataChange(index)  
  }  
  public indexOf(data: T): number {  
    return this.dataArray.indexOf(data)  
  }  
}  
@Entry  
@Component  
struct page240524163225079 {  
  startIndex: number = 10  
  loading: boolean = false;  
  private arr: MyDataSource<number> = new MyDataSource()  
  private scroller: Scroller = new Scroller()  
  
  aboutToAppear(): void {  
    for (let i = 0; i < 16; i++) {  
      this.arr.pushData(i)  
    }  
  }  
  build() {  
    Column() {  
      List({ initialIndex: 10, space: 20, scroller: this.scroller }) {  
        LazyForEach(this.arr, (item: number) => {  
          ListItem() {  
            Column() {  
              Text('' + item)  
                .width('100%')  
                .height(100)  
                .fontSize(16)  
                .textAlign(TextAlign.Center)  
                .borderRadius(10)  
                .backgroundColor(0xFFFFFF)  
              Image($r('app.media.background'))  
                .height(200)  
                .height(200)  
            }  
          }  
        }, (item: string) => item)  
      }.width('90%')  
      .scrollBar(BarState.Off)  
      .onScrollIndex((start: number) => {  
        this.startIndex = start;  
        console.log('this.startIndex', this.startIndex)  
        if (start < 5 && !this.loading) {  
          setTimeout(() => {  
            let indexOffset = this.scroller.getItemRect(this.startIndex).y;  
            let a = this.arr.getData(0)  
            for (let i = 0; i < 10; i++) {  
              this.arr.addData(0, a - i - 1);  
            }  
            this.scroller.scrollToIndex(this.startIndex + 10);  
            this.scroller.scrollBy(0, -indexOffset);  
            this.loading = false;  
          }, 1000)  
          this.loading = true;  
        }  
      })  
    }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 })  
  }  
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
分享
微博
QQ
微信
回复
2024-10-16 15:56:25
相关问题
HarmonyOS 如何做到页面弹框之上?
1289浏览 • 1回复 待解决
HarmonyOS 列表刷新时候会闪
970浏览 • 1回复 待解决
HarmonyOS List列表滚动到指定位置
1218浏览 • 1回复 待解决
鸿蒙应用如何做到防抓包
323浏览 • 0回复 待解决
数组列表如何实现数据双向同步?
1248浏览 • 1回复 待解决
如何做到点击通知消息打开应用
1426浏览 • 1回复 待解决
如何更新页面列表数据
8015浏览 • 1回复 待解决