0

このクラスをサブクラス化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関数の両方が次の順序で 3 回呼び出されます: layoutcontents -> measure、layoutcontens -> measure、layoutcontents -> measure。

サイズを無効にするため、1 回呼び出されることは理解できますが、3 回は奇妙に思えます。なぜこれが起こっているのか、あるいはこれを防ぐ方法さえ知っている人はいますか?

4

1 に答える 1

1

本当の疑問は、なぜコンポーネントが 3 回の完全なレンダラー サイクルを経ているのかということでした。いくつかの議論の後、これが私たちが見つけたものです:

  1. 無効化サイクルが最初にトリガーされるのは、マウスが押されたとき、または場合によってはタッチ開始イベントが発生したときです。これにより、コンポーネントがホバー状態になります。これにより、コンポーネントの視覚的な変化が生じます。
  2. 無効化サイクルが 2 回目にトリガーされるのは、項目が選択されたときです。これにより、レンダラーが停止状態になります。別の視覚的インジケータが描画されるようにします。
  3. 3 番目の無効化サイクルは、コンポーネント自体のコードが原因です。layoutContents() が invalidatesize() を呼び出すとき
于 2012-08-28T19:33:35.387 に答える