Apache flex 将UIComponent实现为TileListItemRenderer

Apache flex 将UIComponent实现为TileListItemRenderer,apache-flex,tilelist,Apache Flex,Tilelist,我在flex中编写了一些代码。我将16个UIC组件添加到网格容器中 网格并没有真正给我我想要的,所以我不想使用它,我想尝试使用tilelist,因为它有很多非常好的内置功能 据我所知,要将项添加到tilelist,需要定义数据提供程序和项呈现程序 在概念上,我很难将UIComponent实现为一个itemrenderer。 谁能帮帮我吗 我发现有两个主要问题 首先,在我的初始实现中,我在设计时向UIComponents添加了唯一的ID。这些唯一的ID在我的应用程序中非常重要,我不知道如何将它们分

我在flex中编写了一些代码。我将16个UIC组件添加到网格容器中

网格并没有真正给我我想要的,所以我不想使用它,我想尝试使用tilelist,因为它有很多非常好的内置功能

据我所知,要将项添加到tilelist,需要定义数据提供程序和项呈现程序

在概念上,我很难将UIComponent实现为一个itemrenderer。 谁能帮帮我吗

我发现有两个主要问题

首先,在我的初始实现中,我在设计时向UIComponents添加了唯一的ID。这些唯一的ID在我的应用程序中非常重要,我不知道如何将它们分配给tilelistitemrenderer

其次,我的UIcomponets有3个我的网格监听的自定义事件。我不知道如何将这些侦听器分配给tilelist itemrenderer

这是我的原始网格代码

网格代码

<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>

这是我的UIComponet代码,我现在想成为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>

[Event(name=“verify”,type=“components.remix.events.PadContentEvent”)]
[事件(name=“requestplay”,type=“components.remix.events.PadEvent”)]
[事件(name=“requeststop”,type=“components.remix.events.PadEvent”)]

我很确定您应该在网格代码中为网格设置dataProvider=arrayCollection,在itemRenderer中,您应该引用“data”对象

当为网格设置itemRenderer时,itemRenderer中的{data}变量知道如何查找适当的dataProvider数组元素


很好的例子。(我看不出您在哪里设置了数据提供程序或引用了上述代码中的数据项)

您不能为ItemRenders设置唯一的ID,因为它们可以重复使用。相反,您可以构建具有唯一id的(值)对象。该对象由itemrenderer表示。我猜这些值对象将在我的dataprovider中设置?知道如何向ItemRenders添加事件侦听器吗?谢谢。这是我第一次使用数据提供者和项目呈现器。我不明白两者之间的联系,所以是的。。。。上面的代码乱七八糟:)我通过使用从数据提供程序传入对象的itemToItemRenderer方法将侦听器添加到ItemRenderer中。