Egret引擎中的ArrayCollection数据集合详解
概述
ArrayCollection是Egret引擎eui模块中提供的一个重要数据结构类,它是对普通数组的封装,实现了ICollection接口。在Egret游戏开发中,ArrayCollection常被用作数据容器,与List、DataGroup等视图组件配合使用,实现数据与视图的绑定和自动更新。
核心功能
1. 数据源管理
ArrayCollection的核心是管理一个数据源数组,开发者可以通过source
属性获取或设置这个数组:
let data = new ArrayCollection([1, 2, 3]);
console.log(data.source); // 输出 [1, 2, 3]
需要注意的是,直接修改source
属性会触发完整的视图刷新(RESET事件),而通过ArrayCollection提供的方法修改数据则会触发更精确的更新事件。
2. 数据操作API
ArrayCollection提供了一系列方法来操作数据:
-
添加数据:
data.addItem(4); // 在末尾添加 data.addItemAt(0, 0); // 在指定位置添加
-
删除数据:
data.removeItemAt(0); // 删除指定位置 data.removeAll(); // 清空所有
-
查询数据:
let item = data.getItemAt(1); // 获取指定位置 let index = data.getItemIndex(3); // 查找索引
-
替换数据:
data.replaceItemAt(5, 1); // 替换指定位置 data.replaceAll([6, 7, 8]); // 替换全部
3. 数据变更通知
ArrayCollection最重要的特性是能够在数据变更时自动通知视图更新:
data.addEventListener(CollectionEvent.COLLECTION_CHANGE, (e: CollectionEvent) => {
console.log(`数据变更类型: ${e.kind}`);
console.log(`变更位置: ${e.location}`);
console.log(`变更项目: ${e.items}`);
}, this);
支持的事件类型包括:
- ADD:添加项目
- REMOVE:删除项目
- REPLACE:替换项目
- UPDATE:项目更新
- REFRESH:刷新
- RESET:重置数据源
使用场景
1. 与List组件配合
let list = new eui.List();
list.dataProvider = new ArrayCollection(["Item1", "Item2", "Item3"]);
当ArrayCollection中的数据变化时,List会自动更新显示。
2. 数据更新通知
当数据项本身的属性发生变化时,需要手动调用itemUpdated()
通知视图:
let obj = {name: "Egret"};
let data = new ArrayCollection([obj]);
obj.name = "New Name";
data.itemUpdated(obj); // 通知视图更新
3. 批量数据替换
使用replaceAll()
可以在保留视图滚动位置的情况下更新数据:
// 不会重置List的滚动位置
data.replaceAll(["A", "B", "C"]);
最佳实践
-
避免直接操作source数组:直接修改source数组不会触发变更事件,视图不会自动更新。必须通过ArrayCollection提供的方法修改数据。
-
合理使用refresh():当对数据源进行了排序或过滤操作后,应调用refresh()手动刷新视图。
-
注意性能优化:对于大批量数据操作,尽量使用replaceAll()而不是多次addItem/removeItem。
-
及时清理引用:当不再需要ArrayCollection时,应移除所有事件监听,防止内存泄漏。
实现原理
ArrayCollection通过封装数组并实现ICollection接口,在每次数据变更时派发CollectionEvent事件。视图组件(如List)监听这些事件并做出相应的更新:
- 数据变更检测:所有修改数据的方法都会记录变更类型和位置
- 事件派发:通过dispatchCoEvent()方法派发对应的事件
- 视图更新:视图组件根据事件类型执行局部更新或全局刷新
这种机制相比直接使用数组,虽然有一定性能开销,但大大简化了数据与视图同步的逻辑。
总结
ArrayCollection是Egret引擎中连接数据和视图的重要桥梁,它提供了丰富的数据操作API和自动的变更通知机制。合理使用ArrayCollection可以显著提高开发效率,特别是在处理复杂列表数据时。理解其工作原理和最佳实践,有助于开发出性能更好、更易维护的Egret应用。