2013-07-21 5 views
0

Я создал простую Callout со списком в ней. Как это:Spark Mobile 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> 

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

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

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

Как это сделать? Много thx для вашего ввода.

+0

I Ставка, реализующая метод measure() на вашем пользовательском компоненте, решит эту проблему. – JeffryHouser

+0

@ Reboog711 Да, я, скорее всего, сделаю это. Но сейчас я не нахожу времени. Я отправлю заполненный код, как только это будет сделано. Много thx. –

ответ

0

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

  1. Прислушайтесь Callout 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()"> 
    
  2. Force выноски переделать его макет/калибруете:

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

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

+0

Я пробовал, но это не работает в моем случае :(Проблема должна быть где-то в списке или в его макете. Я временно связал вашу инициализацию с 'ResizeEvent.Resize', которая по крайней мере повторно добавляет всплывающее окно на после того, как List изменяет размер при любом взаимодействии с пользователем.Но List не должен изменять размер в первую очередь, но получить правильные измерения с самого начала.Таким образом, ваш ответ примерно наполовину правильный ;-) BTW: Если я удалю свой «пользовательский» макет, Список не изменяет размер, но недостаточно для отображения данных. –

+0

Странно, тег @Lee Burrows не работает для меня прямо сейчас, надеюсь, вы все равно получите это. thx снова –

+0

вы также можете попробовать обосновать список макета horizontalAlign - я нашел контент оправданным, чтобы быть неприятным –