HarmonyOS 鸿蒙Next list加载上一页如何实现

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

HarmonyOS 鸿蒙Next list加载上一页如何实现

例如: 目前通过list 和 懒加载 有十个数据, 加载上一页的时候 需要在数据头部添加十个新的数据, 通过notifyDataAdd(0), 加载成功十个数据后,当前list显示的item索引值是0(新的十个数据的第一个数据),  想要目标,当前list显示索引值是 旧数据的第1个数据, 在该数据前面还有十个数据可滑动

3 回复
深色代码主题
复制
[@ComponentV2](/user/ComponentV2)
[@Entry](/user/Entry)
struct ListIndex {
  ds: DataSource = new DataSource()
  listScroller: ListScroller = new ListScroller()

build() { Column() { Button(‘加载’) .onClick(() => { this.ds.list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] this.ds.listener?.onDataReloaded() this.listScroller.scrollToIndex(10, false) }) List({ scroller: this.listScroller }) { LazyForEach(this.ds, (item: number) => { ListItem() { Text(item.toString()) .height(‘100vp’) } }, (item: number) => item.toString()) }.height(‘100%’) .width(‘100%’) }.size({ width: ‘100%’, height: ‘100%’ }) } }

class DataSource implements IDataSource { list: number[] = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20] listener: DataChangeListener | null = null

totalCount(): number { return this.list.length }

getData(index: number): number { return this.list[index] }

registerDataChangeListener(listener: DataChangeListener): void { this.listener = listener }

unregisterDataChangeListener(listener: DataChangeListener): void { this.listener = null } }

更多关于HarmonyOS 鸿蒙Next list加载上一页如何实现的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


可以参考下这个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.dataArray[from], this.dataArray[to]] = [this.dataArray[to], this.dataArray[from]]
    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;
  // [@State](/user/State) arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
  private arr: MyDataSource<number> = new MyDataSource()
  private scroller: Scroller = new Scroller()
  @State num: number = 60
  aboutToAppear(): void {
    for (let i = 0; i < 11; i++) {
      this.arr.pushData(i)
    }
  }
  build() {
    Column() {
      Button('点击开始定时器看看下来加载是否刷新')
        .onClick(() => {
          setInterval(() => {
            this.num--
          }, 1000)
        })
      List({ initialIndex: 10, space: 20, scroller: this.scroller }) {
        LazyForEach(this.arr, (item: number) => {
          ListItem() {
            Column() {
              Text('' + item + "----------" + this.num)
                .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 })
  }
}

在HarmonyOS鸿蒙系统中实现Next list加载上一页的功能,通常涉及对列表控件的数据管理逻辑进行调整。以下是实现该功能的核心思路:

  1. 数据状态管理

    • 维护一个当前页码变量(如currentPage),初始化为1。
    • 维护一个布尔变量(如hasMore),用于标记是否还有更多数据可加载。
  2. 列表加载逻辑

    • 当用户滚动到列表底部时,触发加载更多数据的操作。
    • 检查hasMore变量,若为真,则根据currentPage请求下一页数据。
    • 更新列表数据源,并刷新列表显示。
    • 根据返回的数据判断是否有更多数据,更新hasMore变量。
  3. 实现上一页加载

    • 提供一个按钮或手势操作,允许用户请求加载上一页数据。
    • 检查当前页码currentPage是否大于1,若是,则将其减1。
    • 根据新的页码请求数据,并更新列表显示。
  4. 错误处理

    • 在数据请求过程中,处理可能的网络错误或数据格式错误。
    • 确保用户界面的友好提示,如加载失败重试按钮。

示例代码实现需根据具体框架和控件调整,上述步骤提供了实现思路。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部