'预测'Flex组件

时间:2009-06-12 00:27:08

标签: flex flex3

我正在实现一个自定义Flex组件,该组件在(可能非常大的)数据网格上提供可滚动的视点。我正在使用ItemRenderer模式,这样我在给定时间内只有屏幕上可见元素的UIComponents。换句话说,类似于标准的DataGrid控件。

我的一个要求是动态调整网格单元的大小以适应提供的数据,以便预先知道列宽和行高。 (当用户滚动并且新单元格进入视图时,列宽和行高不会波动。)

此要求意味着在更改组件的dataSource或itemRenderer时要执行的整个网格的“预测量”阶段。我想使用标准的Flex组件测量操作来执行此预测量阶段。

我目前的预测量阶段策略是:

  • 获取itemRenderer实例
  • 初始化itemRenderer
  • 对于数据源中的每个单元格:
    • 将itemRenderer的'data'对象设置为该单元格的数据
    • '组件上的commitProperties()'
    • 'measure()'组件
    • 根据测量结果适当更新列宽/行高

我不想将itemRenderer附加到应用程序的显示列表中,但这意味着它不会被框架初始化。此外,我需要渲染器的初始化和commitProperties /测量阶段同步发生。我害怕我需要复制多少Flex组件生命周期管理框架才能实现这一目标。

所以我呼吁那些比我更有经验的人用智慧的话语:

  • 对此策略的可行性有何想法​​?
  • 关于如何优雅地利用框架为我执行此测量的任何建议?
  • 任何更好的确定细胞大小的策略?

2 个答案:

答案 0 :(得分:1)

我对框架代码进行了一些研究,如果初步结果是一个迹象,那就不像我担心的那样痛苦。它的内涵:

var renderer:IListItemRenderer = getRenderer();
renderer.initialize();
for each (var cell:Object in cells) {
    renderer.data = cell;
    renderer.validateProperties();
    renderer.validateSize(true);
    // Access renderer's size properties here
}

将'recursive = true'标志传递给validateSize是我之前遗漏的关键。不幸的是,validateProperties没有相应的标志,所以我可能必须自己实现它以使其对任意ItemRenderers可靠。

答案 1 :(得分:0)

我从来没有以这种方式应用itemRenderers,所以,不确定这会对你的方法有多大影响,但是你在设置

super.data = data

位于渲染器数据设置器的顶部?即:

override public function set data(value:Object):void
{     
super.data = value;     
...
}

如果没有,您可以尝试添加它,看看它是否消除了validateProperties()中递归标记的需要。