HarmonyOS鸿蒙Next中如何实现列表的上拉加载功能?

HarmonyOS鸿蒙Next中如何实现列表的上拉加载功能? 专题:ArkUI(eTS)常见UI效果汇总(更新中)

主要通过onScrollIndex()方法判断List组件是否滑动到底部,然后通过是否正在加载、是否还有数据两个变量状态判断是否需要加载新的数据。代码如下:

import prompt from '@system.prompt'
@Entry
@Componentstruct Index {
  @State private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
  @State isLoading:boolean=false;
  @State hasData:boolean=true;

  build() {
    Stack() {
      List() {
        ForEach(this.arr, (item) => {
          ListItem() {
            Text('' + item)
              .width('100%')
              .height(100)
              .fontSize(16)
              .textAlign(TextAlign.Center)
              .borderRadius(10)
              .backgroundColor(0xFFFFFF)
          }.editable(true)
        }, item => item)

        if(!this.hasData){
          ListItem() {
            Text('没有更多数据了')
              .width('100%')
              .height(40)
              .fontSize(16)
              .textAlign(TextAlign.Center)
              .backgroundColor(0xCECECE)
          }
        } else {
          if (this.isLoading && this.hasData) {
            ListItem() {
              Text('正在加载数据')
                .width('100%')
                .height(40)
                .fontSize(16)
                .textAlign(TextAlign.Center)
                .backgroundColor(0xFFFFFF)
            }
          }
        }
      }
      .divider({ strokeWidth: 1, color: 0xcdcdcd}) // 每行之间的分界线
      .edgeEffect(EdgeEffect.None) // 滑动到边缘无效果
      .onScrollIndex((firstIndex: number, lastIndex: number) => {
        if(this.hasData&& !this.isLoading && lastIndex>=this.arr.length-1){
          this.isLoading=true;
          this.loadMoreData();
        }
        console.info('first' + firstIndex+'    last' + lastIndex)
      })
      .width('100%')
    }.width('100%').height('100%').backgroundColor(0xDCDCDC)
  }

  loadMoreData(){
    prompt.showToast({
      message: "加载数据"
    });
    setTimeout(() => {
      this.isLoading = false
      this.arr.push(21, 22, 23, 24, 25, 26, 27, 28, 29, 30)
      this.hasData=false;
    }, 3000);
  }
}
3 回复

大佬,你的这个加载 显示完没有数据后,是不是不会自动回弹的?

我想在滑动停止后,根据条件list列表自动滑动到某一项,如第2项item。 但我在各类scroll监听里,调用scroller.scrollToIndex()都会直接白屏。 大佬有遇到么?

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


在HarmonyOS鸿蒙Next中,实现列表的上拉加载功能可以通过ListContainer组件和PageSlider组件结合使用。首先,使用ListContainer来展示列表数据,然后通过监听PageSlider的滑动事件来判断是否到达列表底部。当用户滑动到列表底部时,触发加载更多数据的逻辑。

具体步骤如下:

  1. 创建ListContainer:在布局文件中定义ListContainer,用于展示列表数据。
  2. 设置Adapter:为ListContainer设置适配器,用于绑定数据。
  3. 监听滑动事件:通过PageSliderOnPageChangeListener监听滑动事件,判断是否滑动到列表底部。
  4. 加载更多数据:当滑动到底部时,调用加载更多数据的方法,更新适配器中的数据并刷新列表。

示例代码片段如下:

ListContainer listContainer = (ListContainer) findComponentById(ResourceTable.Id_list_container);
PageSlider pageSlider = (PageSlider) findComponentById(ResourceTable.Id_page_slider);

pageSlider.setPageChangeListener(new PageSlider.PageChangedListener() {
    @Override
    public void onPageChanged(int i) {
        if (i == listContainer.getChildCount() - 1) {
            // 加载更多数据
            loadMoreData();
        }
    }
});

private void loadMoreData() {
    // 加载更多数据的逻辑
    // 更新适配器中的数据
    listContainer.getAdapter().notifyDataChanged();
}

在HarmonyOS鸿蒙Next中,实现列表的上拉加载功能可以通过ListContainer组件结合OnScrollListener监听器来实现。首先,创建一个ListContainer并设置适配器。然后,通过setOnScrollListener方法监听滚动事件,在onScroll方法中判断是否滚动到底部。如果滚动到底部,触发加载更多数据的逻辑,并更新适配器。最后,确保在UI线程中更新数据,以避免界面卡顿。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!