测量'Flex组件
我正在实现一个自定义的Flex组件,该组件提供了一个可滚动的视图到一个(可能非常大的)数据网格上。 我使用ItemRenderer模式,这样我就只有UIComponents在给定的时间在屏幕上可见的元素。 换句话说,类似于标准DataGrid控件。
我要求的一个要求是动态调整网格单元的大小以适应所提供的数据,从而使列宽度和行高度在前面已知。 (当用户滚动并看到新的单元格时,列宽和行高不会波动。)
这个要求意味着当组件的dataSource或itemRenderer被改变时,整个网格的“预先测量”阶段被执行。 我想使用标准Flex组件测量操作来执行此预测量阶段。
我现在的这个测量前阶段的策略是:
我宁愿不将itemRenderer附加到应用程序的显示列表中,但这意味着它不会被框架初始化。 另外,我需要渲染器的初始化和commitProperties / measurement阶段同步发生。 我害怕我必须复制多少Flex组件生命周期管理框架才能完成此任务。
所以我呼吁那些比我更有经验的人用智慧的话来说:
我研究了框架代码,如果初步结果是一个迹象,这并不像我担心的那样痛苦。 它的胆量:
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的等效标志,所以我可能必须自己实现这个标志才能使它对于任意ItemRenderer是可靠的。
我从来没有以这种方式应用itemRenderer,所以,不知道这会发挥多大的作用,你是接近,但你设置
super.data = data
在渲染器的数据设置器的顶部? 即:
override public function set data(value:Object):void
{
super.data = value;
...
}
如果没有,你可以尝试添加它,看看它是否消除了在validateProperties()
递归标志的需要。
上一篇: measuring' Flex Components
下一篇: ItemRenderer height (and height changes) not reflected in AdvancedDataGrid row