我已成功从sqlite收到数据。我看到数据出现在跟踪功能中,但是我遇到了正确显示这些数据的问题。我认为它与绑定对象有关。我必须在某处遗漏某些东西,所以请纠正我错在哪里。此外,这个问题实际上是Adobe Air: drag & drop grouped components
的延续无论如何,这是我的ItemRenderer:
<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
autoDrawBackground="true">
<fx:Script>
[Bindable]
public var tree:TreeClass_Full;
[Bindable]
public var dataText:String = "empty";
public function setTest():void{
resultTextArea.text = "AAA";
}
</fx:Script>
<s:HGroup x="5" y="5" width="350" height="150" horizontalAlign="center" verticalAlign="middle">
<mx:Image id = "resultImage" width="100" height="100"/>
<s:TextArea id="resultTextArea" height="141" editable="false"
text = "{tree.Common_Name}"/>
</s:HGroup>
</s:ItemRenderer>
这是在sqlite查询成功后将调用的函数:
[Bindable]
public var dragDropLeft:ArrayCollection = new ArrayCollection();
[Bindable]
public var dragDropRight:ArrayCollection = new ArrayCollection();
protected function ResultFill():void
{
// TODO Auto-generated method stub
if (arr != null){
for (var i:int = 0; i < arr.length; ++i){
var tc:TreeClass_Full = arr[i];
var rr:resultRenderer = new resultRenderer();
rr.tree = tc;
trace("--Common Name:" + tc.Common_Name);
rr.dataText = tc.Common_Name;
rr.resultImage.source = tc.Picture1;
rr.resultTextArea.text = tc.Common_Name;
trace("----Common Name:" + rr.resultTextArea.text);
dragDropLeft.addItem(rr);
}
}
}
sqlite查询成功后,将调用上述函数。这是我将我的Object(我的ItemClass从sqlite)的信息放入我的ItemRenderer的地方。
我的ItemRenderer有两个组件:Image和TextArea。 sqlite包含将用于Image的相应图像。对于TextArea,数据库中的所有可显示文本都将放在那里 - 这意味着来自数据库的多个字段的字符串将全部放在那里。 (但是现在,我只想要一个字段,即Common_Name)
之后,我将这些ItemRenderer放入我的列表中(在本例中为dragDropLeft)。但是,数据不会出现在程序中。 然而,跟踪功能正确输出文本。
我已经尝试了一些东西,并且我保留了一些代码,并且所有代码都产生了相同的结果:TextArea中的文本根本没有改变。我忘记了什么?
更新:
这里的代码涵盖了我使用Bindable ArrayCollection的地方:
<s:HGroup width="100%" height="85%" verticalAlign="middle">
<s:List dataProvider="{dragDropLeft}" width = "45%" height = "95%"
dragEnabled="true" dragMoveEnabled="true" dropEnabled="true"
itemRenderer="resultRenderer"/>
<s:List dataProvider="{dragDropRight}" width = "45%" height = "95%"
dragEnabled="true" dragMoveEnabled="true" dropEnabled="true"
itemRenderer="resultRenderer"/>
</s:HGroup>
基本上,我试图通过从sqlite给它的值来自己操纵我的ItemRenderer,但是从其中一个评论员看来,这似乎不正确。那我们该怎么做呢? 我们如何将数据发送到将添加到列表中的ItemRenderer对象?
答案 0 :(得分:2)
正如我在评论中所说:列表不是容器。你不能只是添加孩子。您应该将数据对象添加到其dataProvider
。基本上整个ResultFill
方法应该简化为:
dragDropLeft.dataProvider = new ArrayCollection(arr);
表示此数据的ItemRenderers将由List组件在内部创建。在您的自定义ItemRenderer中,您现在可以通过data
属性访问此数据,因此它将变为如下所示:
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
autoDrawBackground="true">
<s:HGroup x="5" y="5" width="350" height="150"
horizontalAlign="center" verticalAlign="middle">
<s:Image source="{data.Picture1}" width="100" height="100"/>
<s:TextArea text="{data.Common_Name}" height="141" editable="false" />
</s:HGroup>
</s:ItemRenderer>
请注意,我假设此示例中TreeClass_Full
的属性为bindable
。