我正在实现一个自定义Flex组件,该组件在(可能非常大的)数据网格上提供可滚动的视点。我正在使用ItemRenderer模式,这样我在给定时间内只有屏幕上可见元素的UIComponents。换句话说,类似于标准的DataGrid控件。
我的一个要求是动态调整网格单元的大小以适应提供的数据,以便预先知道列宽和行高。 (当用户滚动并且新单元格进入视图时,列宽和行高不会波动。)
此要求意味着在更改组件的dataSource或itemRenderer时要执行的整个网格的“预测量”阶段。我想使用标准的Flex组件测量操作来执行此预测量阶段。
我目前的预测量阶段策略是:
我不想将itemRenderer附加到应用程序的显示列表中,但这意味着它不会被框架初始化。此外,我需要渲染器的初始化和commitProperties /测量阶段同步发生。我害怕我需要复制多少Flex组件生命周期管理框架才能实现这一目标。
所以我呼吁那些比我更有经验的人用智慧的话语:
答案 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()
中递归标记的需要。