2010-08-13 4 views
0

J'avais du code sur lequel je travaillais en flex. J'avais 16 UIComponents ajoutés à un conteneur Grid.Implémentation de UIComponent en tant que TileListItemRenderer

La grille ne me donnait pas vraiment ce que je voulais tellement que je voulais essayer d'utiliser une liste de prix car elle contient beaucoup de fonctionnalités intégrées. Pour autant que je sache, pour ajouter des éléments à une liste de liste, vous devez définir un fournisseur de données et un moteur de rendu d'article.

Je me bats conceptuellement en prenant mon UIComponent et en l'implémentant comme un itemrenderer. Quelqu'un pourrait m'aider?

Il y a 2 problèmes principaux que je vois.

Tout d'abord, dans ma mise en œuvre initiale, j'avais ajouté des identifiants uniques à mes UIComponents au moment du design. Ces identifiants uniques sont très importants dans mon application et je ne suis pas sûr de savoir comment les attribuer à un tilelistitemrenderer. Deuxièmement, mes UIcomponets avaient 3 événements personnalisés que ma grille écoutait. Je ne sais pas comment assigner ces auditeurs à un itemrenderer de tilelist.

Voici mon code de grille d'origine

GRID CODE

<mx:GridRow id="row0"> 
    <mx:GridItem width="100%" 
     height="100%"> 
    <PadDisplay:Pad id="channel_0_pad_0" 
     channelNumber="0" 
     padNumber="0" 
     currentPadState="{PalletteCode.EMPTY}" 
     verify="verifyItemOnPad(event)" 
     requestplay="requestPlayHandler(event)" 
     requeststop="requestStopHandler(event)"/> 
    </mx:GridItem> 
    <mx:GridItem width="100%" 
     height="100%"> 
    <PadDisplay:Pad id="channel_0_pad_1" 
     channelNumber="0" 
     padNumber="1" 
     currentPadState="{PalletteCode.EMPTY}" 
     verify="verifyItemOnPad(event)" 
     requestplay="requestPlayHandler(event)" 
     requeststop="requestStopHandler(event)"/> 
    </mx:GridItem> 
    <mx:GridItem width="100%" 
     height="100%"> 
    <PadDisplay:Pad id="channel_0_pad_2" 
     channelNumber="0" 
     padNumber="2" 
     currentPadState="{PalletteCode.EMPTY}" 
     verify="verifyItemOnPad(event)" 
     requestplay="requestPlayHandler(event)" 
     requeststop="requestStopHandler(event)"/> 
    </mx:GridItem> 
    <mx:GridItem width="100%" 
     height="100%"> 
    <PadDisplay:Pad id="channel_0_pad_3" 
     width="{padwidth}" 
     height="36" 
     currentPadState="{PalletteCode.EMPTY}" 
     verify="verifyItemOnPad(event)" 
     requestplay="requestPlayHandler(event)" 
     requeststop="requestStopHandler(event)"/> 
    </mx:GridItem> 
</mx:GridRow> 

Heres est mon code UIComponet que je veux maintenant être un TileListItemRender

<mx:UIComponent xmlns:mx="http://www.adobe.com/2006/mxml" 
    initialize="init(event)" 
    dragEnter="input_dragEnterHandler(event)" 
    dragDrop="input_dragDropHandler(event)"> 
<mx:Script> 
    <![CDATA[ 
    import components.remix.events.PadEvent; 
    import mx.binding.utils.BindingUtils; 
    import components.remix.events.PadContentEvent; 
    import mx.core.DragSource; 
    import mx.core.IUIComponent; 
    import fl.data.DataProvider; 
    import mx.managers.DragManager; 
    import mx.events.DragEvent; 
    import mx.collections.IList; 
    import mx.events.FlexEvent; 
    public var _padCode:PadCode 
    public var pad:pad_v1_0_1 
    [Bindable] 
    public var padNumber:int; 
    [Bindable] 
    public var channelNumber:int 
    [Bindable] 
    public var currentPadState:String= PalletteCode.EMPTY; 


    private function init(e:FlexEvent):void 
    { 
    _padCode=new PadCode() 
    pad=new pad_v1_0_1() 
    pad.cacheAsBitmap=true; 
    pad.spinnymc.visible=false 
    pad.gotoAndStop("empty") 
    addChild(pad) 
    _padCode._targetComponent=this; 
    this.buttonMode=true 
    setInitialState() 
    addEventListener(MouseEvent.MOUSE_UP,padClicked) 
    } 

    private function input_dragEnterHandler(event:DragEvent):void 
    { 

    if (event.dragSource.hasFormat(PadContent.LOOP_FORMAT)) 
    DragManager.acceptDragDrop(this) 


    } 

    private function input_dragDropHandler(event:DragEvent):void 
    { 
    var dropTarget:IUIComponent=event.currentTarget as IUIComponent; 
    var dragSource:DragSource=event.dragSource; 
    var padContent:PadContent=new PadContent() 
    padContent.channelNumber=channelNumber 
    padContent.padNumber=padNumber 


    if (dragSource.hasFormat(PadContent.LOOP_FORMAT)) 
    { 
    var data:Object=event.dragSource.dataForFormat(PadContent.LOOP_FORMAT); 

    padContent.format=PadContent.LOOP_FORMAT 
    padContent.parseContent(data) 
    dispatchEvent(new PadContentEvent(PadContentEvent.VERIFY, padContent)) 
    } 
    } 

    public function setInitialState():void 
    { 
    /**switch (currentPadState) 
    { 
    case (PalletteCode.EMPTY): 

     pad.gotoAndStop("empty"); 
     pad.visible=false; 
     this.buttonMode=false; 
     break; 


    case (PalletteCode.IDLE): 

     pad.gotoAndStop("grey"); 
     pad.addEventListener(MouseEvent.CLICK, padClicked) 
     //pad.addEventListener(MouseEvent.MOUSE_OVER, padover) 
     //pad.addEventListener(MouseEvent.MOUSE_OUT, padout) 
     pad.alpha=.5; 

     this.buttonMode=true; 
     break; 

    }**/ 
    } 


    private function padClicked(e:MouseEvent=null):void 
    { 
    //var p:pad_v1_0_1=e.currentTarget as pad_v1_0_1; 

    //var pc:PadContainer=p.holder; 
    trace("pad clicked") 

    switch (currentPadState) 
    { 
    case (PalletteCode.IDLE): 
     // send play command 
     dispatchEvent(new PadEvent(PadEvent.REQUEST_PLAY, channelNumber, padNumber)) 
     currentPadState=PalletteCode.QUEUEING; 
     pad.gotoAndStop("amber"); 

     break; 

    case (PalletteCode.PLAYING): 

     // send stop command 
     dispatchEvent(new PadEvent(PadEvent.REQUEST_STOP, channelNumber, padNumber)) 
     currentPadState=PalletteCode.STOPPING; 
     pad.gotoAndStop("red"); 
     break; 

    } 


    } 
    ]]> 
</mx:Script> 

<mx:Metadata> 
     [Event(name="verify", type="components.remix.events.PadContentEvent")] 
     [Event(name="requestplay", type="components.remix.events.PadEvent")] 
     [Event(name="requeststop", type="components.remix.events.PadEvent")] 


    </mx:Metadata> 



</mx:UIComponent> 
+0

Vous ne pouvez pas avoir des identifiants uniques pour les itemRenderers car ils pourraient être réutilisés. Au lieu de cela, vous pouvez créer des objets (valeur) avec les ID uniques. Cet objet est représenté par l'itemrenderer. – hering

+0

et je suppose que ces objets de valeur seraient définis dans mon fournisseur de données? – dubbeat

+0

une idée de comment ajouter des écouteurs d'événement aux rendus? – dubbeat

Répondre

0

Im assez sûr que vous devriez installerez un dataProvider = arrayCollection pour la grille dans le code de la grille, et dans itemRenderer, vous devriez faire référence à un objet 'data'. Lorsque le paramètre itemRenderer est défini pour la grille, la variable {data} dans le composant itemRenderer sait rechercher les éléments du tableau dataProvider appropriés.

Bon exemple here. (Je ne vois pas où vous avez défini votre fournisseur de données ou vous référez aux éléments de données dans le code ci-dessus)

+0

merci. C'est un peu ma première utilisation de dataproviders avec des rendus d'éléments. Je n'ai pas compris l'association entre les deux si yeah .... le code ci-dessus est un gâchis horrible :) J'ai réussi à ajouter des écouteurs à mes itemrenderers en y arrivant en utilisant la méthode itemToItemRenderer passant dans l'objet du fournisseur de données. – dubbeat