我有一些我在flex工作的代码。我有16个UIComponents添加到网格容器中。
网格并没有真正给我我想要的东西,所以我不想使用它,我想尝试使用一个瓷砖列表,因为它有许多非常好的内置功能。</ p>
据我所知,要将项目添加到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>
Heres是我的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>
答案 0 :(得分:0)
我非常确定您应该在网格代码中为网格设置dataProvider = arrayCollection,而在itemRenderer中,您应该引用“数据”对象。
当为Grid设置itemRenderer时,itemRenderer中的{data}变量知道查找相应的dataProvider数组元素。
好例子here。 (我只是看不到你在哪里设置数据提供者或参考上面代码中的数据项)