2012-06-15 118 views
0

我试图通过创建使用称为TwoLabelCell延伸AlternatingCellRenderer,看起来像这样类中的两个标签,标签字段创建一个简单的两个标记列表:参数传递到自定义CellRender

package views 
{ 
    import flash.text.TextFormat; 

    import qnx.fuse.ui.listClasses.AlternatingCellRenderer; 
    import qnx.fuse.ui.text.Label; 

    public class TwoLabelCell extends AlternatingCellRenderer { 
     private var description:Label; 
     private var labelFormat:TextFormat; 
     private var text:String; 

     public function TwoLabelCell(labelText:String) { 
      this.text = labelText; 
     } 

     override protected function init():void { 
      super.init(); 

      labelFormat = new TextFormat(); 
      labelFormat.color = 0x777777; 
      labelFormat.size = 17; 

      description = new Label(); 
      description.x = 17; 
      description.y = 33; 
      description.format = labelFormat; 
      description.text = text; 

      this.addChild(description); 
     } 
    } 
} 

记住这一个当时只是一个测试,所以我只使用一个标签(在找出这个问题之后,我将添加其他标签并使用相同的逻辑)。这里的主要想法是,当我打电话给它时,它将设置text变量,它将用于在列表创建时更改列表上的标签文本。现在,这里的主应用程序文件:

package { 
    import flash.display.Sprite; 

    import qnx.fuse.ui.events.ListEvent; 
    import qnx.fuse.ui.listClasses.List; 
    import qnx.fuse.ui.listClasses.ListSelectionMode; 
    import qnx.fuse.ui.listClasses.ScrollDirection; 
    import qnx.ui.data.DataProvider; 

    import views.TwoLabelCell; 

    [SWF(height="600", width="1024", frameRate="30", backgroundColor="#FFFFFF")] 
    public class PackTrack extends Sprite { 
     private var packList:List; 

     public function PackTrack() { 
      super(); 

      initializeUI(); 
     } 

     private function initializeUI():void { 
      packList = new List(); 
      packList.setPosition(0, 0); 
      packList.width = 310; 
      packList.height = 400; 
      packList.rowHeight = 50; 
      packList.selectionMode = ListSelectionMode.SINGLE; 
      packList.scrollDirection = ScrollDirection.VERTICAL; 

      var arrMonth:Array=[]; 
      arrMonth.push({label: "January"}); 
      arrMonth.push({label: "February"}); 
      arrMonth.push({label: "March"}); 
      arrMonth.push({label: "April"}); 
      arrMonth.push({label: "May"}); 
      arrMonth.push({label: "June"}); 
      arrMonth.push({label: "July"}); 
      arrMonth.push({label: "August"}); 
      arrMonth.push({label: "September"}); 
      arrMonth.push({label: "October"}); 
      arrMonth.push({label: "November"}); 
      arrMonth.push({label: "December"}); 

      packList.dataProvider = new DataProvider(arrMonth); 
      packList.cellRenderer = TwoLabelCell("Testing Label"); 

      packList.addEventListener(ListEvent.ITEM_CLICKED, onListClick); 

      this.addChild(packList); 
     } 

     private function onListClick(event:ListEvent):void { 
      trace("Item clicked: " + event.data.label); 
      trace("Index clicked: " + event.index); 
     } 
    } 
} 

当我尝试运行我得到这个错误:

TypeError: Error #1034: Type Coercion failed: cannot convert "Testing Label" to views.TwoLabelCell. 
    at PackTrack/initializeUI()[/Users/Nathan/Documents/Adobe Flash Builder 4.6/AIRTest/src/PackTrack.as:46] 
    at PackTrack()[/Users/Nathan/Documents/Adobe Flash Builder 4.6/AIRTest/src/PackTrack.as:19] 

上的任何想法如何解决这个问题?

PS:我学习的Flex(从Java未来)

回答

4

直接回答你的问题:你是因为你想在packList.cellRenderer = TwoLabelCell("Testing Label")投一个字符串到TwoLabelCell得到一个classcast错误。所以我想你只是忘了new关键字。

我可以告诉你来自一个Java背景:该代码看起来很轻快;)
所以我想我会告诉你我会怎么做这个Flex的方式。我不知道你使用的这些黑莓课程,所以我必须坚持使用普通的Flex来展示它。

创建具有可绑定属性的模型类:

public class Pack {  
    [Bindable] public var label:String; 
    [Bindable] public var description:String;  
} 

现在创建一个ItemRenderer类呈现在列表中的数据,让我们把它PackRenderer.mxml

<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       autoDrawBackground="true" 
       height="50"> 

    <s:layout> 
     <s:HorizontalLayout verticalAlign="middle" /> 
    </s:layout> 

    <s:Label id="labelDisplay" /> 
    <s:Label text="{data.description}" color="0x777777" fontSize="17" /> 

</s:ItemRenderer> 

通知我设置height50这与您使用的rowHeight具有相同的效果。 ItemRenderer的data属性是它将表示的包模型实例。
带有标识labelDisplay的标签将自动获取由Flex框架分配给其text属性的值data.label。对于其他标签,我使用数据绑定({})将模型description属性绑定到标签的text属性。

这个itemRenderer的创建列表:

<fx:Script> 
    <![CDATA[ 
     protected function handleItemSelected():void { 
      trace("Item selected: " + list.selectedItem.label); 
      trace("Index selected: " + list.selectedIndex); 
     } 
    ]]> 
</fx:Script> 

<fx:Declarations> 
    <s:ArrayCollection id="dp"> 
     <so:Pack label="Item A" description="description A" /> 
     <so:Pack label="Item B" description="description B" /> 
     <so:Pack label="Item C" description="description C" /> 
    </s:ArrayCollection> 
</fx:Declarations> 

<s:List id="list" dataProvider="{dp}" width="310" height="400" 
     itemRenderer="net.riastar.PackItemRenderer" 
     change="handleItemSelected()" /> 

我创建的数据内嵌在这里,当然这个ArrayCollection中也可以同样来自服务器。
List的布局默认是VerticalLayout,所以我没有定义它。
Spark List没有itemClick事件处理程序,所以我使用change处理程序,该处理程序在List的选定索引/项目更改时执行。

+0

难道只有使用ActionScript才能做到这一点吗?因为不喜欢在我的项目(Java的另一个坏习惯)混合语言,具有相同目的,也是因为所有BlackBerry库文档都使用普通ActionScript,所以像我这样的新手可以更容易地实现新事物。 **:)** –

+1

@NathanCampos在我开始使用Flex时,我曾经厌恶混合语言,但事实证明有几种技术可以将它们干净地分开(我当然不能在评论中讨论这些技术)。尽管如此,你可以在普通的ActionScript中做到这一点,但是我怀疑这对你来说会更容易:它会变得更加冗长,你必须更好地了解这个框架。作为一个例子,使用绑定'text =“{data.description}”':在AS中,你必须像这样'BindingUtils.bindProperty(myLabel,'text',data,'description')'这样做。 – RIAstar

+1

@NathanCampos我刚刚写了一个你可能会觉得有趣的答案,因为它讨论了从动作中分离mxml的这种技术(我的首选):http://stackoverflow.com/questions/11059302/custom-composite-control-not-渲染-正确地换仅-0-5-1仲是后/ 11061988#11061988 – RIAstar