在可调整大小的Flex Label ItemRenderer中减少生命周期验证调用

时间:2012-08-28 12:34:05

标签: actionscript-3 flex air flex4 itemrenderer

我已经将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();
    }
}

}

按预期工作,我只是想知道是否有办法减少此渲染器在展开时所执行的验证调用量。 如果单击要展开,layoutContentsmeasure函数将按以下顺序调用三次:layoutcontents - > measure,layoutcontens - > measure,layoutcontents - >测量

我知道他们被召唤一次,因为我使大小无效,但三次似乎很奇怪。 有谁知道为什么会这样,或者甚至可能是如何防止这种情况发生?

1 个答案:

答案 0 :(得分:1)

真正的问题是为什么组件经历了三个完整的渲染器循环?经过一番讨论,这就是我们遇到的情况:

  1. 第一次触发无效循环是指鼠标停止或可能发生触摸开始事件。这使组件进入悬停状态;这会导致组件发生视觉上的变化。
  2. 触发无效循环的第二次是选择项目时。这使渲染器处于关闭状态;导致绘制不同的视觉指示。
  3. 第三个无效循环是由组件自己的代码引起的;当layoutContents()调用invalidatesize()