首页
/ Egret引擎中的ArrayCollection数据集合详解

Egret引擎中的ArrayCollection数据集合详解

2025-07-09 03:08:20作者:管翌锬

概述

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"]);

最佳实践

  1. 避免直接操作source数组:直接修改source数组不会触发变更事件,视图不会自动更新。必须通过ArrayCollection提供的方法修改数据。

  2. 合理使用refresh():当对数据源进行了排序或过滤操作后,应调用refresh()手动刷新视图。

  3. 注意性能优化:对于大批量数据操作,尽量使用replaceAll()而不是多次addItem/removeItem。

  4. 及时清理引用:当不再需要ArrayCollection时,应移除所有事件监听,防止内存泄漏。

实现原理

ArrayCollection通过封装数组并实现ICollection接口,在每次数据变更时派发CollectionEvent事件。视图组件(如List)监听这些事件并做出相应的更新:

  1. 数据变更检测:所有修改数据的方法都会记录变更类型和位置
  2. 事件派发:通过dispatchCoEvent()方法派发对应的事件
  3. 视图更新:视图组件根据事件类型执行局部更新或全局刷新

这种机制相比直接使用数组,虽然有一定性能开销,但大大简化了数据与视图同步的逻辑。

总结

ArrayCollection是Egret引擎中连接数据和视图的重要桥梁,它提供了丰富的数据操作API和自动的变更通知机制。合理使用ArrayCollection可以显著提高开发效率,特别是在处理复杂列表数据时。理解其工作原理和最佳实践,有助于开发出性能更好、更易维护的Egret应用。