HarmonyOS 鸿蒙Next开发案例 | 实现列表上拉加载更多内容

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

HarmonyOS 鸿蒙Next开发案例 | 实现列表上拉加载更多内容

场景说明

列表上拉加载更多内容是一种常见的数据更新场景,常见于各类阅读类应用中,例如新闻阅读应用中,当用户浏览新闻列表到底部时,上拉将加载更多的新闻内容。本例将介绍列表上拉加载更多内容这个场景的具体实现方式。

效果呈现

本示例最终效果如下:

正在加载中

运行环境

本例基于以下环境开发,开发者也可以基于其他适配的版本进行开发:

  • IDE:DevEco Studio 3.1.1 Release
  • SDK:3.1.0(API 9)

实现思路

  1. 在页面布局上,通过在List列表末尾手工增加一个ListItem用于显示加载更多布局,通过visibility属性控制该ListItem的显示和隐藏,当上拉时显示,并根据加载中以及加载结果显示不同内容,加载完成后则隐藏。
  2. 监听List列表的onTouch事件,并判断是否为上划、滑动距离是否达到设定的阈值等条件,在条件满足后,触发数据加载逻辑,重新渲染列表。

开发步骤

  1. 利用ForEach循环渲染初始列表,在列表末尾增加一个ListItem用于显示加载更多布局,通过visibility属性控制显示和隐藏,并在List列表上拉过程中监听并处理onTouch事件。

末尾的ListItem可呈现的内容有:

  • 正在加载中显示“正在加载”。
  • 加载失败则显示"加载失败,点击重试",引导用户进行点击,从而重新加载。
  1. 实现列表上拉加载更多内容的核心,是设计处理onTouch事件的响应函数handleTouchEvent,在该函数中需要根据手指滑动的类型TouchType进行不同的处理:

    a. 手指按下时(TouchType.Down),记录按下的坐标,用于后续滑动方向及滑动距离计算:

    case TouchType.Down: // 手指按下
        this.downY = event.touches[0].y; // 记录按下的y坐标
        this.lastMoveY = event.touches[0].y;
        break;
    

    b. 手指滑动时(TouchType.Move),首先判断是否为上拉动作,如果为上拉动作,再判断是否达到上拉加载更多内容的条件。条件包括:

    • 是否有更多的数据正在处于加载中状态,避免同时加载更多数据,只有当前未处于数据加载状态时才可以加载更多数据,否则直接忽略本次上拉动作。
    • 是否当前列表已滑动到最后一项,只有在最后一项时才可以加载更多数据。
    • 上拉滑动的偏移量是否达到设定的阈值,只有达到阈值才可以加载更多数据。
    case TouchType.Move: // 手指滑动
        if (this.isLoading) { // 更多数据加载中,不进入处理逻辑
          return;
        }
        if (event.touches[0].y - this.lastMoveY < 0) { // 手指上滑
          // 因为加载更多是在列表后面新增一个item,当一屏能够展示全部列表,endIndex 为 length+1
          if (this.endIndex == this.list.length - 1 || this.endIndex == this.list.length) {
            this.offsetY = event.touches[0].y - this.downY; // 滑动的偏移量
            if (Math.abs(this.offsetY) > this.loadMoreHeight) { // 数据加载的阈值
              this.isLoadMore = true // 可以刷新了
              this.offsetY = this.loadMoreHeight + this.offsetY * 0.1 // 偏移量缓慢增加
            }
          }
        }
        this.lastMoveY = event.touches[0].y;
        break;
    

    c. 手指抬起或滑动取消时(TouchType.UP或TouchType.Cancel),如果正处于数据加载中状态,则忽略,否则加载更多数据。

    case TouchType.Up: // 手指抬起
    case TouchType.Cancel: // 事件取消
        if (this.isLoading) { // 更多数据加载中,不进入处理逻辑
          return;
        }
        this.touchUpLoadMore()
        break
    
  2. 实现加载更多数据的逻辑,即在上述步骤的touchUpLoadMore方法中实现以下处理逻辑:

    a. 通过动画处理列表回弹效果。

    animateTo({
      duration: 300, // 动画时长
    }, () => {
      this.offsetY = 0 // 偏移量设置为0
    })
    

    b. 模拟请求加载更多数据的结果,包括:

    • 正在加载:显示加载中效果。
    • 加载成功:重新渲染List,更新加载状态。
    • 加载失败:展示重新加载的引导说明,点击后重新触发touchUpLoadMore方法。
    if (this.isLoadMore) {
      this.isLoading = true // 加载中...
      setTimeout(() => { // 模拟耗时操作
        this.getData()
          .then(data => {
            if (data === StatusType.SUCCESS) { // 加载成功
              this.isShowRetry = false
              this.loadMoreData() // 加载数据
              this.isLoadMore = false // 关闭加载更多
              this.isLoading = false
            }
          })
          .catch(error => { // 加载失败
            this.isShowRetry = true // 展示“点击重试”
            console.info('error message ' + error)
          })
      }, 2000)
    } else { // 关闭加载更多
      this.isLoadMore = false
      this.isLoading = false
    }
    

更多关于HarmonyOS 鸿蒙Next开发案例 | 实现列表上拉加载更多内容的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

9 回复

可以直接使用

.onReachEnd(() => {
  this.isLoadMore = true
})

就可以监听list触底,然后加载更多了

更多关于HarmonyOS 鸿蒙Next开发案例 | 实现列表上拉加载更多内容的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


尝试 onVisibleAreaChange

ListItem() {
}.onVisibleAreaChange([1], (visible,ratio) => {
    if (visible) // TODO load more
})

非常棒的思路

如果设置lanes(2)这种多列展示的列表,底部加载动画怎么居中显示呢?

如果是两列的话,假设垂直放置,要想把加载更多的ListItem放到最后,可以这么做,

  • 如果foreach遍历的item数量%2==1,说明是奇数个,在foreach最后动添加一个ListItem
  • 然后把加载更多的那个ListItem放在最下面,当然样式需要自己修改下,让它看起来像是完整的一行。

讲的也太通俗易懂了吧

你好,我发现一个问题,当按下之后手指下滑到一定长的距离之后,再稍微往上滑动一点点,也会处罚加载更多,这种情况合理吗

监听下是否滑动到底部就行了,

在HarmonyOS鸿蒙Next开发环境中,实现列表上拉加载更多内容的功能,通常可以通过以下步骤进行:

  1. 创建列表组件:首先,在页面中创建一个可滚动的列表组件,例如ListRecycleList,用于展示初始内容。

  2. 监听滚动事件:为列表组件添加滚动事件监听器,通过监听滚动到底部的事件来判断用户是否进行了上拉操作。

  3. 加载更多数据:在滚动到底部的事件处理函数中,调用数据加载逻辑,从数据源获取更多数据,并更新列表内容。

  4. 优化性能:在加载更多数据时,考虑使用分页加载或懒加载策略,以减少内存消耗和提高应用性能。

  5. 处理边界情况:在数据加载完成后,检查是否还有更多数据可以加载。如果没有更多数据,可以禁用上拉加载功能,并向用户显示相应提示。

  6. 错误处理:在数据加载过程中,添加错误处理逻辑,以应对网络故障或数据格式错误等异常情况。

通过上述步骤,你可以在HarmonyOS鸿蒙Next开发中实现列表上拉加载更多内容的功能。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部