HarmonyOS鸿蒙Next中如何实现文章类下拉加载和上拉加载效果?

HarmonyOS鸿蒙Next中如何实现文章类下拉加载和上拉加载效果? 如何实现文章类/列表类下拉加载和上拉加载效果?

3 回复

实现思路

首先进行布局,使用 Refresh 布局,通过 List布局内容。

然后通过SwipeRefresher定义头部加载效果。

  @Builder genrefresh(){ 
    Column(){
      SwipeRefresher({content:'刷新中...',isLoading:true})
    }.padding(20)
  }

最后使用Progress来进行底部的一个自定义加载动态布局 。

@Builder footer(){//自定义加载布局
    Row(){
      Progress({value:5,type:ProgressType.Ring}).style({status:ProgressStatus.LOADING}).color(Color.Black).width(45)
      Text('加载中...').fontSize(20).margin({left:20})
    }.width('100%').padding(10).backgroundColor(Color.White).justifyContent(FlexAlign.Center)
    .visibility(this.isloading?Visibility.Visible:Visibility.Hidden) 
  }

效果

效果

使用场景

文章类、列表类、图片流类等各种数据量多需要加载的场景。

完整代码

import { SwipeRefresher } from '@kit.ArkUI';

@Entry
@Component
struct Refreshpage {
  //刷新
  @State isrefreshing: boolean = false
  //加载
  @State isloading:boolean=false
  //初始人数据显示
  @State sourceData: string[] = ['数据1', '数据2', '数据3', '数据4', '数据5', '数据6', '数据7', '数据8', '数据9', '数据10']
  //新增额外数据
  @State extradatas: string[] = ['新增1', '新增2', '新增3', '新增4', '新增5', '新增6']
  //新数据数据源
  @State newDatas: string[] =
    ['我爱我家1', '我爱我家2', '我爱我家3', '我爱我家4', '我爱我家5', '我爱我家6', '我爱我家7', '我爱我家8', '我爱我家9', '我爱我家10']

  @Builder footer(){
    Row(){
      Progress({value:5,type:ProgressType.Ring}).style({status:ProgressStatus.LOADING}).color(Color.Black).width(45)
      Text('加载中...').fontSize(20).margin({left:20})
    }.width('100%').padding(10).backgroundColor(Color.White).justifyContent(FlexAlign.Center)
    .visibility(this.isloading?Visibility.Visible:Visibility.Hidden) 
  }

  @Builder genrefresh(){ 
    Column(){
      SwipeRefresher({content:'刷新中...',isLoading:true})
    }.padding(20)
  }




  build() {
    Column() {
      Refresh({ refreshing: $$this.isrefreshing,builder:this.genrefresh() }) {
        List() {
          ForEach(this.sourceData, (item: string) => {
            ListItem() {
              Text(item)
                .fontSize(18)
                .border({ width: 0.5, color: Color.Gray })
                .backgroundColor(Color.White)
                .width('100%')
                .textAlign(TextAlign.Center)
                .padding(30)
            }

          },)
          ListItem(){
            this.footer()
          }
        }.width('100%')
        .height('100%')
        .backgroundColor('#F1F3F5')
        .edgeEffect(EdgeEffect.Spring)
        .onScrollIndex((start: number, end: number, center: number) => {
          if (end == this.sourceData.length) {
            this.isloading=true
            setTimeout(() => {
              this.sourceData.push(...this.extradatas)
              this.isloading=false

            }, 2000)
          }
        })
      }.width('100%').height('100%')
      .onRefreshing(() => {
        setTimeout(() => {
          this.sourceData = this.newDatas
          this.isrefreshing = false
        }, 2000)
      })
    }
    .height('100%')
    .width('100%')
  }
}

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


在HarmonyOS Next中,文章类列表的下拉刷新和上拉加载可通过ArkUI的List组件和Refresh组件实现。

  • 下拉刷新:使用Refresh组件包裹List,通过onRefresh回调触发数据刷新。
  • 上拉加载:在ListonReachEnd回调中加载更多数据,或使用ListonScroll监听滚动位置。

数据更新后调用Listreset方法刷新列表。需注意避免重复请求,通常结合分页逻辑处理。

在HarmonyOS Next中,实现文章或列表的下拉刷新与上拉加载更多功能,主要依赖于ArkUI的List组件、Refresh组件以及滚动事件监听。以下是核心实现方案:

1. 下拉刷新实现

使用Refresh组件包裹List,通过onRefresh回调触发数据刷新。

import { Refresh, List, ListItem, Text } from '@kit.ArkUI';

@Entry
@Component
struct ArticleList {
  @State isRefreshing: boolean = false;
  @State articleData: Article[] = []; // 文章数据

  build() {
    Column() {
      Refresh({ refreshing: this.isRefreshing, onRefresh: () => {
        // 触发下拉刷新
        this.isRefreshing = true;
        this.loadNewData(); // 加载新数据
        this.isRefreshing = false;
      }}) {
        List() {
          ForEach(this.articleData, (item: Article) => {
            ListItem() {
              Text(item.title).fontSize(16)
            }
          })
        }
      }
    }
  }

  // 模拟加载新数据
  loadNewData() {
    // 网络请求或本地数据更新
  }
}

2. 上拉加载更多实现

通过监听ListonReachEnd事件,在滚动到底部时加载更多数据。

List({ space: 10 }) {
  ForEach(this.articleData, (item: Article) => {
    ListItem() {
      Text(item.title)
    }
  })
}
.onReachEnd(() => {
  // 触发上拉加载更多
  this.loadMoreData();
})

3. 完整示例代码

结合下拉刷新与上拉加载:

@Entry
@Component
struct ArticleList {
  @State isRefreshing: boolean = false;
  @State isLoadingMore: boolean = false;
  @State articleData: Article[] = [];
  private page: number = 1;

  build() {
    Column() {
      Refresh({ refreshing: this.isRefreshing, onRefresh: () => {
        this.isRefreshing = true;
        this.page = 1;
        this.loadData(true); // 刷新数据
        this.isRefreshing = false;
      }}) {
        List({ space: 10 }) {
          ForEach(this.articleData, (item: Article) => {
            ListItem() {
              Text(item.title).padding(10)
            }
          })

          // 加载更多提示
          if (this.isLoadingMore) {
            ListItem() {
              Text('加载中...').textAlign(TextAlign.Center)
            }
          }
        }
        .onReachEnd(() => {
          if (!this.isLoadingMore) {
            this.page++;
            this.loadData(false); // 加载更多
          }
        })
      }
    }
  }

  async loadData(isRefresh: boolean) {
    if (isRefresh) {
      this.articleData = []; // 清空旧数据
    }
    this.isLoadingMore = true;

    // 模拟异步数据请求
    const newData = await this.fetchData(this.page);
    this.articleData = this.articleData.concat(newData);

    this.isLoadingMore = false;
  }

  async fetchData(page: number): Promise<Article[]> {
    // 实际开发中替换为网络请求
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve([...]); // 返回新数据
      }, 500);
    });
  }
}

关键点说明:

  • Refresh组件:提供标准下拉刷新动效,通过refreshing状态控制显示。
  • onReachEnd事件List内置的触底回调,适用于上拉加载。
  • 状态管理:使用@State管理刷新/加载状态,避免重复请求。
  • 数据分页:通过page参数实现分页逻辑,刷新时重置页码。

扩展建议:

  • 可结合SwipeGesture实现自定义下拉动画。
  • 对于复杂列表,建议使用LazyForEach优化长列表性能。
  • 网络请求需封装异常处理(如加载失败提示)。

此方案采用HarmonyOS Next官方推荐模式,兼顾性能与开发效率。

回到顶部