2014-07-07 3 views
1

У меня возникла проблема, которую я не могу решить. Я использую ActionScript 3 с рамкой Robotlegs. Я должен сделать серию запросов URL в команде. Каждый URL-адрес дает изображение. Я выталкиваю эти изображения в ArrayCollection, а затем отправляю событие с этим массивом ArrayCollection в качестве полезной нагрузки. Этот массив ArrayCollection отправляется в представление, которое использует itemRenderer для отображения изображений. Я проверил, что изображения загружаются в ArrayCollection, но изображения не отображаются в представлении.Загрузите изображения с помощью класса загрузчика и отправьте изображения в arrayCollection

Это то, что я написал в команде,

var arrayCollect:ArrayCollection = new ArrayCollection(); 
var my_loader:Loader = new Loader(); 

my_loader.load(new URLRequest("http://www.joomlaworks.net/images/demos/galleries/abstract/7.jpg")); 
arrayCollect.addItem(my_loader as Object); 
my_loader.load(new URLRequest("http://www.joomlaworks.net/images/demos/galleries/abstract/8.jpg")); 
arrayCollect.addItem(my_loader as Object); 

return arrayCollect; 

Затем arrayCollect время отправки в случае в качестве полезной нагрузки.

dispatch(new XYZEvent (XYZEvent.LOAD_COMPLETE, arrayCollect)); 

В представлении, я использовал itemRenderer.

<s:List id="pqr" 
dataProvider="{data}"> 

.... 
</s:List> 

Изображения не отображаются. Я думаю, проблема заключается в том, что данные в массиве Collection являются объектами типа loader. Поэтому я попытался отобразить его как BitmapImage, но это не решило проблему.

Пожалуйста, помогите мне решить эту проблему.

+0

Лучше сделать loaderService для этого – ThanksBro

ответ

2

Ваша проблема: вы не определили средство визуализации элементов, которое могло бы показывать ваши данные. См. http://help.adobe.com/en_US/Flex/4.0/UsingSDK/WS03d33b8076db57b9-23c04461124bbeca597-8000.html для создания регистров предметов.

Далее: в вашем ArrayCollection вы не создали новый загрузчик. Значение элемента ArrayCollection 1 указывает на тот же лайдер - это пункт 2.

Я добавил пример с двумя списками, один без рендерера, один с рендерером custum. Я не использовал загрузчиков, но, конечно, вы могли бы создать рендерер, который добавит laoder для отображения вместо использования компонента изображения Flex.

Основное применение:

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx"> 
<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 

<fx:Script> 
    <![CDATA[ 
     import mx.collections.ArrayCollection; 

     private var _dataProviderList : ArrayCollection = new ArrayCollection(
      [ 
       "http://www.joomlaworks.net/images/demos/galleries/abstract/7.jpg", 
       "http://www.joomlaworks.net/images/demos/galleries/abstract/8.jpg" 
      ] 
     ); 

    ]]> 
</fx:Script> 

<s:layout> 
    <s:VerticalLayout/> 
</s:layout> 

<s:List dataProvider="{_dataProviderList}"> 

</s:List> 

<s:List itemRenderer="ImageItemRenderer" dataProvider="{_dataProviderList}"> 

</s:List> 

</s:WindowedApplication> 

Renderer

<?xml version="1.0" encoding="utf-8"?> 
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx" 
      autoDrawBackground="true"> 


<mx:Image 
      source="{data}" 
      width="50" height="50"/> 

</s:ItemRenderer> 

Если вы действительно хотите использовать laoder как объект в вашем ArrayCollection, вы могли бы написать рендерер как:

<?xml version="1.0" encoding="utf-8"?> 
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx" 
      autoDrawBackground="true"> 

<fx:Script> 
    <![CDATA[ 

     [Bindable] 
     private var _loader : Loader; 

     private function dataLoaded (evt : Event) : void 
     { 
      _loader = (data as Loader) 
     } 

     override public function set data(value:Object):void 
     { 
      super.data = value; 

      if (data is Loader) { 
       // render items may be reuses (http://stackoverflow.com/questions/7328989/itemrenderer-switching-urlloader-images) 
       (data as Loader).contentLoaderInfo.removeEventListener(Event.COMPLETE, dataLoaded); 

       // data allready loaded 
       if ((data as Loader).content) { 
        _loader = (data as Loader) 
       } 
       else { 
        // wait till data is loaded 
        (data as Loader).contentLoaderInfo.addEventListener(Event.COMPLETE,dataLoaded); 
       } 
      } 
     } 
    ]]> 
</fx:Script> 

<mx:Image 
    source="{_loader}" 
    width="50" height="50"/> 



</s:ItemRenderer> 
+0

Это не проблема. Я уже определил рендеринга элемента внутри akashrajkn

+0

Я должен сделать запрос URL-адреса в другой программе. В этой программе я получаю изображения и создаю ArrayCollection. Я передаю эту коллекцию массива в качестве параметра для средства визуализации элементов. Но массив имеет объекты типа loader. Я написал команду trace для коллекции массивов, я получил это, arrayCollect ======= [объект Loader], [объект Loader], [объект Loader] Это правильно? – akashrajkn

+0

Чтение вашего вопроса, средство визуализации элементов - проблема. Если вы уже создали рендерер custum, вы должны включить его визуализатор в свой вопрос, чтобы дать правильный ответ. –