虚拟列表商品介绍

组件概述

虚拟列表专为大型游戏和应用中展示大量数据列表而设计。通过动态节点管理与复用技术,相比原生 ScrollView 可大幅提升滚动性能内存利用率:point_right: 立即检验

核心特性

  • 节点动态复用,降低内存占用
  • 视锥剔除优化,提升渲染性能
  • 支持多种布局模式(垂直、水平、网格、嵌套)
  • 分帧加载,避免卡顿
  • 支持下拉刷新、上拉刷新
  • 支持动态修改数据和尺寸
  • 多个demo实践(背包,聊天,排行榜,卡牌)

API文档

VirtualList-docs

开发环境

  • 引擎版本:Cocos Creator 3.x/2.x
  • 编程语言:TypeScript

全平台适配

Cocos Creator版本 微信/抖音/快手小游戏 HTML5 (Web) Android iOS
3.x :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
2.x :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:

在线演示

体验地址

节点复用视锥剔除是虚拟列表的核心技术,确保高性能渲染与低内存占用。

针对同方向嵌套列表且需禁止滑动的场景,VirtualCullingViewport组件提供独立剔除能力,挂载即生效,根据视野范围动态创建与回收 item 节点,保证嵌套列表性能优化。

插件优势

  • 注释清晰,挂载即用

  • 丰富的布局支持

  • 自定义模板:支持任意数量

  • 支持嵌套:触摸事件可传递,内部列表事件可作用于外部列表

  • 分帧加载:避免一次性加载大量数据,保证界面流畅

  • 节点池管理:复用节点,减少频繁创建与销毁开销

  • 下拉 / 上拉刷新:传入回调,即可使用

  • 防抖处理:滚动事件防抖,降低重复更新,提高性能

  • 动态数据更新:支持实时修改列表项内容

  • 动态尺寸调整:支持列表项尺寸变更并自动布局

  • 高度复用:节点池与分帧加载结合,降低内存占用

  • 低 DrawCall:优化渲染流程,减少 DrawCall 提升性能

常用接口

  • ReloadData:重载数据,刷新列表
/**
  * 重新加载数据源
  * @param typeArray 类型数据
  * @param customSize 自定义尺寸数组
  * @returns 
  */
public ReloadData(typeArray: Array<string | number>, customSize: number[] = []): void;
  • InsertItemAt:指定位置插入Item
/**
  * 在指定位置插入项目
  * @param index 插入位置索引
  * @param type 插入的类型
  * @param animate 是否动画
  * @param size 插入的尺寸
*/
public InsertItemAt(index: number, type: string | number, animate: boolean = false, size: number = 0): void
  • RemoveItemAt:指定位置删除Item
/**
  * 移除指定位置的项目
  * @param index 要移除的项目索引
  * @param animate 是否使用动画效果
  */
public RemoveItemAt(index: number, animate: boolean = false): void;
  • RegisterTemplate: 注册Item模板
/**
  * 注册模板类型
  * @param type 模板类型标识符
  * @param nodeOrGetter 模板节点或获取节点的函数
  * @param isDefault 是否设为默认模板
  */
public RegisterTemplate(type: string | number, nodeOrGetter: Node | (() => Node), isDefault: boolean = false): void;
  • ScrollToIndex:滚动到指定索引项,使该项出现在屏幕正中央
/**
  * 滚动到指定单元格,使该单元格所在行(或单个项)居中显示
  * @param index 目标单元格索引
  * @param duration 滚动动画时长(秒)
  * @param callback 滚动完成回调
  */
public ScrollToIndex(index: number, duration: number = 0.3, callback?: () => void);
  • UpdateItemSize:更新指定索引项的尺寸
/** 
  * 更新指定单元格的尺寸(动态修改后重排) 
  * 暂不支持网格布局
  */
public UpdateItemSize(index: number, newSize: number);
  • UpdateItemAt:更新指定索引项的数据
/**
  * 更新指定单元格
  * @param index 下标
  * @param type 模版类型(可选参数)
  * @returns 是否更新成功
  */
public UpdateItemAt(index: number, type?: string | number): boolean;
  • Refresh:刷新列表数据或尺寸变化后调用
/** 
  * 刷新列表(数据或尺寸变化后调用) 
  */
public Refresh();
  • PreloadItems: 预加载方法
/**
  * 预加载数据
  */
public PreloadItems(count: number = this.mAutoPreloadCount);

欢迎加入「星空丨菜鸟小栈」

  • 认真讨论技术
  • 吐槽引擎缺陷
  • 愉快摸鱼聊股票
  • 交友约饭嗨起来

image.png

限时福利放送,加群领取30元优惠券

联系作者

:alien: 个人主页: 星空技术探索

:laughing: 作者微信: Chrass-

版本记录(持续更新中)

3.2.4 (2026年01月25日)

  • 针对反向渲染代码进行了优化调整,提升渲染性能
  • 在背包及聊天模块的 Demo 中,新增下拉与上拉提示
  • 引擎升级至 3.8.8 版本

3.2.3(2026年01月09日)

  • 新增批量数据操作方法:PrependData(前置追加)、AppendData(后置追加)及智能刷新方法 RefreshData
  • 优化列表上下拉刷新逻辑,支持多尺寸 Item 动态刷新与异步回调,适配更多业务场景
  • 聊天 Demo 新增下拉刷新历史记录功能
  • 修复虚拟列表 Item 尺寸超过一屏时定位不准确的问题

省略中间版本记录

1.0.0(2025年3月6日)

  • 初始版本发布
  • 实现基本的虚拟列表功能
  • 支持动态修改Item数据和尺寸
  • 新增分帧加载功能
  • 优化节点池管理机制
  • 增加防抖动处理

商城链接

高性能虚拟列表

:grinning:

又来了,哥?

1赞

好朋友,好久不见

现在虚拟ScrollView层出不穷,都大同小异,这个赛道太卷了

哪位?不熟

1赞

18.8和新人交个朋友,188就坑了 :see_no_evil:

这个效果为什么是这样的,进列表或者重置,会先是空白,然后出三条,然后再出三条

感谢大佬反馈!

设计之处:ReloadData 只是给初次加载去使用的,重置调用这个方法也是有点牵强
上个版本已经有了如下方法 RefreshData 智能刷新,demo 也会改用这个接口,保证重置不闪。


1年前,还真是这个价格,哈哈

百家争鸣,是个好现象。 主要是应用范围比较广吧,大多数游戏都会用到吧

1赞

朋友们,加群,可以领取30元优惠券 :rofl:

dc 也不少哦 ,背包如果有一个网格很大的,同时可以展示好几十个道具,道具上的东西种类很多的话, 处理下合批的

精华版:Cocos Creator | cocos-creator-virtual-list-3x

的确,最完美的方案是包含合批的。
目前只有,视锥剔除+节点复用,dc相对较低了,后续进一步迭代,就是纹理合批了。