我已经将LabelItemRenderer
类子类化,以便在我的移动应用中为火花列表创建可扩展的渲染器。
当用户选择项目时,渲染器的大小会增加,会显示其他数据。渲染器基本上看起来像这样(我删除了这里无关紧要的部分,所以这基本上是伪代码)。
public class PositionsGridRenderer extends LabelItemRenderer
{
public function PositionsGridRenderer() {
super();
addEventListener(MouseEvent.CLICK, expandHandler);
}
protected override function createChildren():void {
super.createChildren();
_dg = new DataGroup();
_dg.visible = false;
addChild(_dg);
}
private function expandHandler(event:Event):void {
if(_gridVisible) {
if(!_detailClicked) {
_dg.visible = false;
_gridVisible = false;
}
_detailClicked = false;
} else {
_dg.visible = true;
_gridVisible = true;
}
}
public override function set data(value:Object):void {
if(!value) return;
super.data = value;
var pos:Position = data as Position;
label = pos.positionName;
_dg.dataProvider = pos.positionSymbols;
}
protected override function measure():void {
!_gridVisible ? measuredHeight = 30 : measuredHeight = 30 + getElementPreferredHeight(_dg);
this.height = measuredHeight;
}
protected override function layoutContents(unscaledWidth:Number, unscaledHeight:Number):void {
setElementSize(labelDisplay, unscaledWidth, 30);
setElementPosition(labelDisplay, 10,10);
if(_gridVisible) {
setElementSize(_dg, unscaledWidth, getElementPreferredHeight(_dg));
setElementPosition(_dg, 0, 30);
} else {
setElementSize(_dg, unscaledWidth, 0);
}
invalidateSize();
}
}
}
按预期工作,我只是想知道是否有办法减少此渲染器在展开时所执行的验证调用量。
如果单击要展开,layoutContents
和measure
函数将按以下顺序调用三次:layoutcontents - > measure,layoutcontens - > measure,layoutcontents - >测量
我知道他们被召唤一次,因为我使大小无效,但三次似乎很奇怪。 有谁知道为什么会这样,或者甚至可能是如何防止这种情况发生?
答案 0 :(得分:1)
真正的问题是为什么组件经历了三个完整的渲染器循环?经过一番讨论,这就是我们遇到的情况: