【问题标题】:How do I set the dataProvider for an <s:List> component to be an XML file?如何将 <s:List> 组件的 dataProvider 设置为 XML 文件?
【发布时间】:2009-08-12 19:52:50
【问题描述】:

我有最新的 Beta 版 Adob​​e Flash Builder 4。

我想使用&lt;s:List&gt; 组件,并将dataProvider 指定为XML 文件。

但是,经过大量研究(包括查看 labs.adobe.com 上的文档链接),我仍然不知道该怎么做。

XML 文件将如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>
<imageList>
    <image location="path/to/file1.jpg" />
    <image location="path/to/file2.jpg" />
    <image location="path/to/file3.jpg" />
</imageList>

【问题讨论】:

  • 您是否只想通过网络加载 XML,然后将其显示在 List 或 DataGrid 中?
  • 我基本上是想把它当成配置文件,这样我的客户端就可以指定组件中会出现什么图片。

标签: actionscript-3 apache-flex xml-serialization flex4 adobe


【解决方案1】:

如果您想在列表中显示图像,您应该使用 URLLoader 加载 xml,将其存储在可绑定变量中,并将其作为数据提供者分配给您的列表。该列表应使用 mx:itemrenderer,您可以在其中根据需要自定义视图。

实际代码是这样的

<fx:Script>
    <![CDATA[
        import mx.collections.XMLListCollection;
        import mx.collections.IList;
        import mx.controls.Image;

        private var loader : URLLoader = new URLLoader();

        [Bindable]
        private var xml : XMLList;

        private function init() : void
        {
            this.loader.addEventListener(Event.COMPLETE, onComplete);
            this.loader.load(new URLRequest("data.xml"));
        }

        private function onComplete(evt : Event)  :void
        {
            this.loader.removeEventListener(Event.COMPLETE, onComplete);
            this.xml = new XML(this.loader.data).image;
        }

    ]]>
</fx:Script>

<mx:List id="list" width="200" height="500" dataProvider="{xml}">
    <mx:itemRenderer>
        <fx:Component>
            <mx:Image width="200" height="200" source="{data.@location}" />
        </fx:Component>
    </mx:itemRenderer>
</mx:List>

【讨论】:

  • 我不确定这是否可行 - 我正在使用 组件,它只接受实现 IList 接口的 dataProvider。在重新阅读我的原始帖子时,我发现我并不清楚我正在使用 组件!
【解决方案2】:

如果你想通过网络加载 XML 文件,你可以这样做:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
  xmlns:s="library://ns.adobe.com/flex/spark"
  xmlns:mx="library://ns.adobe.com/flex/halo">

    <fx:Declarations>
      <mx:HTTPService id="srv" url="http://ws.jamesward.com/images.xml"/>
    </fx:Declarations>

    <s:applicationComplete>
      srv.send();
    </s:applicationComplete>

    <s:List dataProvider="{srv.lastResult.images.image}" width="100%" height="100%">
     <s:itemRenderer>
       <fx:Component>
         <mx:Image source="{data.source}"/>
       </fx:Component>
     </s:itemRenderer>
    </s:List>

</s:Application>

【讨论】:

  • 嘿,谢谢詹姆斯。我也会尝试一下 - 看起来是一个很好的解决方案(如果需要,我可以使用本地文件)。
  • 詹姆斯,你说得对 - 谢谢。我会将您的回复标记为答案,并创建一个单独的答案来显示我是如何做到的。
  • 奇怪 - 似乎你只能做出一个正确的答案。
【解决方案3】:

您需要使用 XMLListCollection 类。

<s:List dataProvider="{new XMLListCollection(data.image)}" labelField="@location"/>

【讨论】:

  • 这是否允许我加载外部 XML 文件的内容?
  • 它将您的 XML 转换为 XMLListCollection - XML 的来源不相关。
【解决方案4】:

我最初的目标是在 SWF 外部有一个 XML 文件,我的客户可以自己维护,因此他们可以控制显示的图像。

我发布的第一个答案并不完全是我想要的解决方案:使用fx:XML意味着XML文件的内容实际上是编译成SWF的,因此编译后无法更改。

所以我已经实现了 James 的解决方案。

XML 文件如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>

<images>
    <image source="path/to/image1.jpg" />
    <image source="path/to/image2.jpg" />
    <image source="path/to/image3.jpg" />
    <image source="path/to/image4.jpg" />
</images>

MXML:

<?xml version="1.0" encoding="utf-8"?>

<s:Group
    xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:mx="library://ns.adobe.com/flex/halo"
    >

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            protected function lstImages_creationCompleteHandler(event : FlexEvent) : void
            {
                dpHttpService.send();
            }

        ]]>

    </fx:Script>

    <fx:Declarations>

        <mx:HTTPService
            id="dpHttpService"
            url="images.xml"
        />

    </fx:Declarations>

    <s:List
        id="lstImages"
        dataProvider="{dpHttpService.lastResult.images.image}"
        width="100%"
        itemRenderer="path.to.render.ImageRenderer"
        skinClass="path.to.skins.ListSkin"
        >

        <s:layout>
            <s:HorizontalLayout gap="2" />
        </s:layout>

    </s:List>

</s:Group>

在图像渲染器中,我是这样引用数据的:

<mx:Image
    id="imgRendered"
    source="{data.source}"
/>

这个解决方案真正有用的是,如果我愿意,我还可以将完整的 http:// 引用添加到另一个站点上存在的图像(当然要记住 crossdomain.xml)。

实际上,images.xml 文件可以存在于另一台服务器上。

【讨论】:

  • 奇怪 - 不太清楚为什么这个答案被标记为无用。任何猜测为什么?困惑。
  • 我的猜测是人们不喜欢您选择自己的答案作为最佳答案,因为它是基于 James 提供的答案。不过,我正在标记它,因为无论如何它都是一个有用的答案。
【解决方案5】:

嗯,我找到了一个解决方案。

MXML 将如下所示:

<fx:Declarations>

    <fx:XML
        id="dpXml"
        source="path/to/images.xml"
    />

    <mx:XMLListCollection
        id="dpXmlListCollection"
        source="{dpXml.image}"
    />

</fx:Declarations>

<s:List
    id="lstImages"
    dataProvider="{dpXmlListCollection}"
    itemRenderer="path.to.render.ImageRenderer"
    skinClass="path.to.skins.ListSkin"
    >

    <s:layout>
        <s:HorizontalLayout gap="2" />
    </s:layout>

</s:List>

和 images.xml 像这样:

<?xml version="1.0" encoding="ISO-8859-1"?>
<images>
    <image>
        <location>path/to/image1.jpg</location>
    </image>
    <image>
        <location>path/to/image2.jpg</location>
    </image>
    <image>
        <location>path/to/image3.jpg</location>
    </image>
</images>

非常感谢您的所有回复!

马特

【讨论】:

  • 确认。看起来此解决方案将 XML 文件嵌入到生成的 SWF 中,因此意味着一旦发布代码,它就不可配置。接下来看看 James Ward 的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多