Spark Mobile Callout со списком не правильно позиционирует/изменяет размер

Я создал простую Callout со списком в ней. Как это:

<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>
</s:callout>

Проблема здесь в том, что мой Callout не измеряет правильно. Когда DataProvider добавляется в список, он всегда изменяет размер списка на первый элемент. Когда какое-либо взаимодействие с пользователем происходит со списком, оно неожиданно изменяет размер (корректируется на самый большой элемент).

К сожалению, CallOut-Position не изменяется, что приводит к неуместному выноску, иногда даже на половине экрана.

Поэтому я хочу убедиться, что List имеет нужный размер, прежде чем я открою Callout.

Как я могу это сделать? Много спасибо для вашего ввода.

1 ответ

У меня такая же проблема. Я уверен, что есть более элегантный способ сделать это, но это было мое решение.

  1. Прослушать Callout FlexEvent.CREATION_COMPLETE:

  2. Принудительная выноска повторить настройку/размер:

    function init():void
    {
     validateNow();
     updatePopUpPosition();
    }

В моем приложении я обрабатываю данные списка данных несколько иначе, чем вы, поэтому вам может потребоваться вызвать init() после установки данных.

licensed under cc by-sa 3.0 with attribution.