Apache flex 带列表的Spark Mobile详图索引未正确定位/调整大小
我创建了一个包含列表的简单标注。 像这样:Apache flex 带列表的Spark Mobile详图索引未正确定位/调整大小,apache-flex,mobile,air,flex4,flex-spark,Apache Flex,Mobile,Air,Flex4,Flex Spark,我创建了一个包含列表的简单标注。 像这样: <s:Callout xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" autoLayout="true" > <fx:Declarations> <!-- Plat
<s:Callout xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
autoLayout="true" >
<fx:Declarations>
<!-- Platzieren Sie nichtvisuelle Elemente (z. B. Dienste, Wertobjekte) hier -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import com.skill.flextensions.factories.StyledClassFactory;
import mx.collections.IList;
import spark.components.IconItemRenderer;
import spark.components.List;
import spark.events.IndexChangeEvent;
import spark.layouts.HorizontalAlign;
import spark.layouts.VerticalLayout;
private var _list:List;
//
// PUBLIC PROPERTIES
//
private var _dataProvider:IList;
private var _dataProviderChanged:Boolean = false;
public function get dataProvider():IList
{
return _dataProvider;
}
public function set dataProvider(value:IList):void
{
_dataProvider = value;
_dataProviderChanged = true;
this.invalidateProperties();
}
private var _itemRenderer:IFactory;
private var _itemRendererChanged:Boolean = false;
public function get itemRenderer():IFactory
{
return _itemRenderer;
}
public function set itemRenderer(value:IFactory):void
{
_itemRenderer = value;
_itemRendererChanged = true;
this.invalidateProperties();
}
//
// @ SUPER
//
override protected function commitProperties():void
{
super.commitProperties();
if(_dataProviderChanged)
{
_dataProviderChanged = false;
_list.dataProvider = _dataProvider;
// TODO
// we have to remeasure, after dataprovider updated
// unfortunately, this doesn't work:
/*
_list.invalidateSize();
_list.invalidateDisplayList();
_list.validateNow();
invalidateSize();
invalidateDisplayList();
validateNow();
*/
// so we will have to find a workaround for this situation.
}
if(_itemRendererChanged)
{
_itemRendererChanged= false;
_list.itemRenderer = getItemRenderer();
}
}
override protected function createChildren():void
{
_list = new List;
_list.top = _list.bottom = 0;
_list.itemRenderer = getItemRenderer();
_list.addEventListener( IndexChangeEvent.CHANGE , onChange , false , 0 , true );
var l:VerticalLayout = new VerticalLayout;
l.gap = 0;
l.requestedMinRowCount = 0;
l.horizontalAlign = HorizontalAlign.CONTENT_JUSTIFY;
_list.layout = l;
this.addElement( _list );
}
//
// @ LIST
//
protected function onChange(e:IndexChangeEvent):void
{
var obj:Object = _list.selectedItem;
this.removeAllElements();
_list = null;
this.close(true , obj);
}
private function getItemRenderer():IFactory
{
if( ! _itemRenderer )
{
var fac:StyledClassFactory = new StyledClassFactory( IconItemRenderer );
var props:Object = new Object;
props.messageField = "message";
props.labelField = "";
props.styleName = "itemName";
props.iconField = "icon";
var styles:Object = new Object;
styles.messageStyleName = "itemHeadline";
fac.properties = props;
fac.styles = styles;
return fac;
}
return _itemRenderer;
}
]]>
</fx:Script>
所以,在打开详图索引之前,我要确保列表的大小正确
我该怎么做?许多thx供您输入。我也有同样的问题。我相信有一种更优雅的方式可以做到这一点,但这是我的解决方案
侦听调用FlexEvent.CREATION_COMPLETE:
<s:Callout xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
autoLayout="true"
creationComplete="init()">
在我的应用程序中,我处理列表数据填充的方式与您略有不同,因此您可能需要在设置数据后调用init()。我尝试过,但在我的情况下不起作用:(问题一定在列表或其布局中的某个位置。我临时将您的init绑定到ResizeEvent.Resize
,在任何用户交互上调整大小后,它至少会将弹出窗口重新定位回列表中。但是列表不应该首先调整大小,而是从一开始就获得正确的尺寸。因此,您的答案是:大约有一半是正确的;-)顺便说一句:如果我删除我的“自定义”布局,列表不会调整大小,但也不够大,无法显示数据。奇怪的是,@Lee Burrows标记现在对我不起作用,我希望你能得到它。thx Again你也可以尝试对齐列表布局horizontalAlign-我发现内容对齐很麻烦列表不会显示在r中那好吧。我已经试过了。我想我会按照Rebog711的建议去做,实施一个度量()。但目前我坚持你建议的解决方法。很多thx。我打赌实施一个度量()自定义组件上的方法将解决此问题。@Reboog711是的,我很可能会这样做。但现在我找不到时间。我会在完成代码后尽快发布。很多thx。
function init():void
{
validateNow();
updatePopUpPosition();
}