0

我已成功接收到来自 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查询成功后,会调用上述函数。这是我将我的对象(我的来自 sqlite 的 ItemClass)的信息放入我的 ItemRenderer 的地方。

我的 ItemRenderer 有两个组件:Image 和 TextArea。sqlite 包含将用于 Image 的相应图像。对于 TextArea,数据库中所有可显示的文本都将被放置在那里——这意味着来自数据库多个字段的字符串都将被放在一起。(但现在,我只想要一个字段,即 Common_Name)

之后,我将这些 ItemRenderers 放入我的列表(在本例中为 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 对象?

4

1 回答 1

2

正如我在评论中所说:列表不是容器。你不能只给它添加孩子。您应该将数据对象添加到其dataProvider. 基本上整个ResultFill方法应该简化为:

dragDropLeft.dataProvider = new ArrayCollection(arr);

表示此数据的 ItemRenderer 将由 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_Fullbindable

于 2012-05-15T08:28:47.443 回答