このクラスをサブクラス化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
関数の両方が次の順序で 3 回呼び出されます: layoutcontents -> measure、layoutcontens -> measure、layoutcontents -> measure。
サイズを無効にするため、1 回呼び出されることは理解できますが、3 回は奇妙に思えます。なぜこれが起こっているのか、あるいはこれを防ぐ方法さえ知っている人はいますか?