Adobe Air:需要帮助将数据从sqlite传输到组件

时间:2012-05-14 18:20:54

标签: flex sqlite data-binding air itemrenderer

我已成功从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对象?

1 个答案:

答案 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