У меня есть TileList с пользовательским ItemRenderer (IR). IR может быть TextInput, TextArea или ComboBox. Если в строке есть TextArea, я хочу, чтобы эта строка имела большую высоту, чем другие. Мне все равно, все ли строки должны иметь одинаковую высоту. Меня волнует, что если у меня есть форма без TextArea, я хочу, чтобы высота строки была минимально возможной.
После некоторой работы я получил следующий код. Но, как вы оцените на прилагаемых снимках экрана, я не достиг того, чего хочу. Первый раз, когда вы вводите форму, она выглядит неправильно, но при втором входе в нее она выглядит нормально. Но, если вы войдете в другую форму с другими полями и снова откроете ту, которую открыли только что, она снова выглядит неправильно Когда это выглядит неправильно, кажется, что каждый ряд имеет стандартную высоту.
Чего мне не хватает? Должен ли я каким-то образом настроить TileList? Поместил ли я invalidateDisplayList и invalidateSize не в то место?
Форма 1 Дело неверно:
http://flic.kr/p/bfJSUM
Форма 1 Дело в порядке:
http://flic.kr/p/bfJSQT
Форма 2 Дело неверно:
http://flic.kr/p/bfJSSn
Форма 2 Дело в порядке:
http://flic.kr/p/bfJUwe
TileList:
<mx:VBox id="camposextras" visible="true" verticalGap="0" horizontalGap="0" width="100%" height="100%" >
<mx:TileList wordWrap="true" variableRowHeight="true" width="100%" textAlign="left" columnCount="2" dataProvider="{model.specialfield_issue_list}" itemRenderer="org.nevis.cairngorm.mod.view.IRCampoEspecial" direction="horizontal">
</mx:TileList>
</mx:VBox>
ItemRenderer:
<?xml version="1.0"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
horizontalAlign="left" verticalAlign="middle"
verticalGap="0" borderStyle="none" width="100%"
horizontalScrollPolicy="off" verticalScrollPolicy="off"
>
<mx:Script>
<![CDATA[
import mx.controls.TextArea;
import mx.controls.Text;
import org.nevis.cairngorm.mod.model.ModelLocator;
import mx.core.UIComponent;
import mx.controls.Label;
import mx.controls.ComboBox;
import mx.controls.TextInput;
import utils.Utils;
import mx.collections.ArrayCollection;
import mx.controls.Alert;
[Bindable]
public var model:ModelLocator=ModelLocator.getInstance();
[Bindable]
private var fieldLabelVisible:Boolean = false;
[Bindable]
private var textInputVisible:Boolean = false;
[Bindable]
private var textAreaVisible:Boolean = false;
[Bindable]
private var comboBoxVisible:Boolean = false;
[Bindable]
private var mandatoryLabelVisible:Boolean = false;
[Bindable]
private var _contenedorHeight:int = 25;
public function updata_valor_text(valor:Event):void {
data.value=valor.currentTarget.text;
}
public function updata_valor_combo(valor:Event):void {
data.value=valor.currentTarget.selectedItem.valuesspecialfieldid
}
/**
* Make sure IR has real variable height for rows
*/
override public function get height():Number {
//Make sure variableRowHeight is set to true in the container of this IR
return _contenedorHeight;
}
override public function set height(value:Number):void {
_contenedorHeight = value;
}
override public function set data(value:Object):void {
var i:int;
var sel:int;
super.data = value;
callLater(function onceAllCreated():void{
if (value){
_contenedorHeight = 25; //Default value
fieldLabelVisible = true;
lb.text=value.spe_name;
lb.toolTip=value.spe_description;
lb.width=150;
lb.name='etiqueta';
lb.styleName='texto-iza';
switch (value.type){
case "text":
if(value.spe_max<=40) {
ti.text=value.value;
ti.name='texto';
ti.maxChars=value.spe_max;
if(value.spe_max<=20) {
ti.width=150;
} else {
ti.width=300;
}
textInputVisible = true;
} else {
ta.text=value.value;
ta.name='texto';
ta.maxChars=value.spe_max;
ta.width=300;
textAreaVisible = true;
_contenedorHeight = 60;
}
break;
case "select":
cb.labelField='val_value';
cb.name='seleccionable';
cb.width=150;
comboBoxVisible = true;
break;
default:break;
}
if (value.spe_mandatory==1){
mandatory.text="*";
mandatory.toolTip="Mandatory";
mandatory.width=10;
mandatory.name='mandatory';
mandatory.styleName='texto-iza';
mandatoryLabelVisible = true;
}
} else {
fieldLabelVisible = false;
textInputVisible = false;
textAreaVisible = false;
comboBoxVisible = false;
mandatoryLabelVisible = false;
}
invalidateDisplayList();
invalidateSize();
});
}
]]>
</mx:Script>
<mx:HBox id="contenedor" toolTip="{data.spe_description}" verticalAlign="middle" horizontalAlign="left" width="100%" height="{_contenedorHeight}">
<mx:Label id="lb" visible="{fieldLabelVisible}" includeInLayout="{fieldLabelVisible}"/>
<mx:TextInput id="ti" visible="{textInputVisible}" includeInLayout="{textInputVisible}" change="updata_valor_text(event)"/>
<mx:TextArea id="ta" visible="{textAreaVisible}" includeInLayout="{textAreaVisible}" height="50" change="updata_valor_text(event)"/>
<mx:ComboBox id="cb" visible="{comboBoxVisible}" includeInLayout="{comboBoxVisible}" change="updata_valor_combo(event)"/>
<mx:Label id="mandatory" visible="{mandatoryLabelVisible}" includeInLayout="{mandatoryLabelVisible}"/>
</mx:HBox>
</mx:VBox>
ПРИМЕЧАНИЕ. Это старое приложение, созданное с помощью Flex 2 SDK 2.0.1 Hotfix 3.
Спасибо за вашу помощь!