Apache flex 将参数传递给自定义CellRender
我试图通过使用名为Apache flex 将参数传递给自定义CellRender,apache-flex,flex4,blackberry-playbook,Apache Flex,Flex4,Blackberry Playbook,我试图通过使用名为TwoLabelCell的类创建两个标签字段来创建一个简单的双标签列表,该类扩展了AlternatingCellRenderer,如下所示: package views { import flash.text.TextFormat; import qnx.fuse.ui.listClasses.AlternatingCellRenderer; import qnx.fuse.ui.text.Label; public class TwoLab
TwoLabelCell
的类创建两个标签字段来创建一个简单的双标签列表,该类扩展了AlternatingCellRenderer
,如下所示:
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)来直接回答您的问题:您遇到了一个classcast错误,因为您试图在
packList.cellRenderer=TwoLabelCell(“测试标签”)
处向TwoLabelCell强制转换字符串。所以我猜你只是忘记了new
关键字
我可以告诉你,你有Java背景:那段代码看起来非常灵活;)所以我想我会告诉你我将如何以灵活的方式做到这一点。我不知道您使用的这些Blackberry类,所以我必须坚持使用普通的Flex来演示它 创建具有可绑定属性的模型类:
public class Pack {
[Bindable] public var label:String;
[Bindable] public var description:String;
}
现在创建一个ItemRenderer类来呈现列表中的数据,我们称之为packrender.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>
我在这里内联创建了数据,但当然,这个ArrayCollection也可以来自服务器。列表的布局默认为垂直布局,因此我不定义它。
Spark列表没有
itemClick
事件处理程序,因此我使用change
处理程序,只要列表的选定索引/项发生更改,就会执行该命令。直接回答您的问题:您将遇到一个classcast错误,因为您试图在packList.cellRenderer=TwoLabelCell(“测试标签”)
处向TwoLabelCell强制转换字符串。所以我猜你只是忘记了new
关键字
我可以告诉你,你有Java背景:那段代码看起来非常灵活;)所以我想我会告诉你我将如何以灵活的方式做到这一点。我不知道您使用的这些Blackberry类,所以我必须坚持使用普通的Flex来演示它 创建具有可绑定属性的模型类:
public class Pack {
[Bindable] public var label:String;
[Bindable] public var description:String;
}
现在创建一个ItemRenderer类来呈现列表中的数据,我们称之为packrender.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>
我在这里内联创建了数据,但当然,这个ArrayCollection也可以来自服务器。列表的布局默认为垂直布局,因此我不定义它。
Spark列表没有
itemClick
事件处理程序,因此我使用change
处理程序,每当列表的所选索引/项目发生更改时都会执行该处理程序。是否只有使用ActionScript才能做到这一点?因为我不喜欢在我的项目中混用这些语言,这有着同样的目的(Java的另一个坏习惯),也因为所有BlackBerry library文档都使用简单的ActionScript,像我这样的新手更容易实现新事物。:)@NathanCampos当我开始使用Flex时,我也很讨厌语言的混合,但事实证明有几种技术可以将它们清晰地分开(当然我不能在评论中讨论)。尽管如此,您可以用简单的ActionScript来完成这一切,但我怀疑这对您来说会更容易:它会更加冗长,您必须更好地了解框架。例如,以绑定text=“{data.description}”
:在As中,您必须这样做BindingUtils.bindProperty(myLabel,'text',data,'description')
@NathanCampos我刚刚写了一个答案,您可能会觉得有趣,因为它讨论了这种技术(我的首选)要将mxml与actionscript分离:难道没有任何方法仅使用actionscript来实现这一点吗?因为我不喜欢在我的项目中混用这些语言,这有着同样的目的(Java的另一个坏习惯),也因为所有BlackBerry library文档都使用简单的ActionScript,像我这样的新手更容易实现新事物。:)@NathanCampos当我开始使用Flex时,我也很讨厌语言的混合,但事实证明有几种技术可以将它们清晰地分开(当然我不能在评论中讨论)。尽管如此,您可以用简单的ActionScript来完成这一切,但我怀疑这对您来说会更容易:它会更加冗长,您必须更好地了解框架。例如,以绑定text=“{data.description}”
:在As中,您必须这样做BindingUtils.bindProperty(myLabel,'text',data,'description')
@NathanCampos我刚刚写了一个答案,您可能会觉得有趣,因为它讨论了将mxml与actionscript分离的技术(我的首选):