Skip to content

Grid Example

Horizontal card grid with two rows.

ts
import { _decorator, Component, instantiate, Prefab, Node } from 'cc';
import { VirtualViewList } from 'assets/Script/Core/VirtualList/VirtualViewList';
import { ViewLayoutType, ScrollDirection } from 'assets/Script/Core/VirtualList/VirtualListTypes';

const { ccclass, property } = _decorator;

@ccclass('GridListExample')
export class GridListExample extends Component {
  @property(Prefab)
  cardPrefab: Prefab | null = null;

  private types: Array<string | number> = [];

  onLoad() {
    this.types = Array.from({ length: 30 }, () => 'card');
  }

  start() {
    const list = this.node.getComponent(VirtualViewList)!;

    list.RegisterTemplate('card', () => this.createCard(), true);

    list['layoutType'] = ViewLayoutType.GRID;
    list['scrollDirection'] = ScrollDirection.HORIZONTAL;
    list['rows'] = 2;
    list['girdHoriColsSpacing'] = 24;
    list['girdHoriRowsSpacing'] = 16;

    list.SetCallbacks({
      onItemInit: (node, index) => this.setupCard(node, index),
      onItemUpdate: (node, index) => this.setupCard(node, index)
    });

    list.ReloadData(this.types);
  }

  private createCard(): Node {
    if (!this.cardPrefab) {
      throw new Error('Please assign cardPrefab in the inspector.');
    }
    return instantiate(this.cardPrefab);
  }

  private setupCard(node: Node, index: number) {
    // Populate card visuals here.
  }
}

Tip: you can configure layout-related properties directly in the inspector instead of assigning them at runtime.