wer32
22.04.2010, 14:34
Дамы и Господа может кто нибудь сталкивался с такой проблемой.
создал List
<mx:List rollOverColor="White" selectionColor="White"
creationComplete="OnInit()" dataProvider="{lData}"
itemRenderer="{new ClassFactory(ReportsListBoxItem)}"
height="100%" width="100%"
variableRowHeight="true"
xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
[Bindable]
private var lData:ArrayCollection = new ArrayCollection();
public function SetData(lXMLData:XMLList):void
{
lData = new ArrayCollection();
for each(var xmlItem:XML in lXMLData)
{
var objItem:Object = new Object();
objItem.XML = xmlItem;
objItem.label = String(xmlItem.@label);
lData.addItem(objItem);
}
this.selectedIndex = 0;
}
]]>
</mx:Script>
</mx:List>
как видно ниже у него ItemRenderer - ReportsListBoxItem
// ReportsListBoxItem.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="OnInit()"
width="100%">
<mx:Script>
<![CDATA[
[Bindable]
public var m_strLabel:String = "";
public override function set data(value:Object):void
{
super.data = value;
if (value != null)
{
m_strLabel = value.label;
}
}
override protected function measure():void
{
super.measure();
if (m_strLabel.length > 0)
{
measuredHeight = this.getExplicitOrMeasuredHeight();
}
}
]]>
</mx:Script>
<mx:Text id="lblItem"
text="{m_strLabel}"
color="Red"
styleName="ItemRender"
selectable="false"
width="100%"/>
</mx:HBox>
Проблемма в том, что высота у каждого итем рендера прыгает сильно, и когда перезаполняю одними и теми же данными, в первый раз оно не верно выставляет высоту рендерера, при втором заполнении оно выставляет конкретную высоту. Из-за этого в List врубается или отключается скрол. как будто его заполнили тучей элементов (хотя в нем всего один).
Если хардкодить measuredHeight к примеру measuredHeight = 50;
то высота у каждого элемента фиксированная и лист работает коректно, но сами рендереры неправильной высоты.
Как вариант решения вижу подсчет высоты <mx:Text id="lblItem"/>
только как это сделать не подозреваю.
создал List
<mx:List rollOverColor="White" selectionColor="White"
creationComplete="OnInit()" dataProvider="{lData}"
itemRenderer="{new ClassFactory(ReportsListBoxItem)}"
height="100%" width="100%"
variableRowHeight="true"
xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
[Bindable]
private var lData:ArrayCollection = new ArrayCollection();
public function SetData(lXMLData:XMLList):void
{
lData = new ArrayCollection();
for each(var xmlItem:XML in lXMLData)
{
var objItem:Object = new Object();
objItem.XML = xmlItem;
objItem.label = String(xmlItem.@label);
lData.addItem(objItem);
}
this.selectedIndex = 0;
}
]]>
</mx:Script>
</mx:List>
как видно ниже у него ItemRenderer - ReportsListBoxItem
// ReportsListBoxItem.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="OnInit()"
width="100%">
<mx:Script>
<![CDATA[
[Bindable]
public var m_strLabel:String = "";
public override function set data(value:Object):void
{
super.data = value;
if (value != null)
{
m_strLabel = value.label;
}
}
override protected function measure():void
{
super.measure();
if (m_strLabel.length > 0)
{
measuredHeight = this.getExplicitOrMeasuredHeight();
}
}
]]>
</mx:Script>
<mx:Text id="lblItem"
text="{m_strLabel}"
color="Red"
styleName="ItemRender"
selectable="false"
width="100%"/>
</mx:HBox>
Проблемма в том, что высота у каждого итем рендера прыгает сильно, и когда перезаполняю одними и теми же данными, в первый раз оно не верно выставляет высоту рендерера, при втором заполнении оно выставляет конкретную высоту. Из-за этого в List врубается или отключается скрол. как будто его заполнили тучей элементов (хотя в нем всего один).
Если хардкодить measuredHeight к примеру measuredHeight = 50;
то высота у каждого элемента фиксированная и лист работает коректно, но сами рендереры неправильной высоты.
Как вариант решения вижу подсчет высоты <mx:Text id="lblItem"/>
только как это сделать не подозреваю.