1

我正在使用一个组件,并且目前有一个 dataProvider 工作ArrayCollection(有一个单独的问题,关于如何使它成为一个 XML 文件......但我离题了)。

变量声明如下所示:

[Bindable]
private var _dpImageList : ArrayCollection = new ArrayCollection([
    {"location" : "path/to/image1.jpg"},
    {"location" : "path/to/image2.jpg"},
    {"location" : "path/to/image3.jpg"}
]);

然后我指的是这样的:

<s:List
    id="lstImages"
    width="100%"
    dataProvider="{_dpImageList}"
    itemRenderer="path.to.render.ImageRenderer"
    skinClass="path.to.skins.ListSkin"
    >
    <s:layout>
        <s:HorizontalLayout gap="2" />
    </s:layout>
</s:List>

目前,似乎每个项目都是异步处理的。

但是,我希望它们被同步处理。

原因:我正在显示一个图像列表,并且我希望首先渲染最左侧的图像,然后是其右侧的图像,依此类推。


编辑:

我刚刚找到了这个答案
你认为这可能是同一个问题吗?

4

1 回答 1

2

不要声明变量并将其用作绑定源,而是声明两个集合。然后,onCreationComplete 调用 loadNext() 将对象移出第二个数组并将其推入第一个数组。当项目已被渲染(由 itemRenderer 调度并捕获的自定义事件)再次调用 loadNext() 直到源数组为空并且绑定的 dataProvider 具有所有图像。

如果这没有任何意义,我可以用代码编写它。;)

<?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" minWidth="1024" minHeight="768" creationComplete="init()">
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            [Bindable]
            private var _source : ArrayCollection = new ArrayCollection([
                {"location" : "path/to/image1.jpg"},
                {"location" : "path/to/image2.jpg"},
                {"location" : "path/to/image3.jpg"}
            ]);         

            [Bindable] private var dataProvider:ArrayCollection;

            protected function init():void
            {
                this.lstImages.addEventListener( "imageLoaded", handleImageLoaded);
                loadImage()
            }

            protected function loadImage():void
            {
                if(this._source.length<=0)
                    return;
                var image:Object = this._source.getItemAt(0);
                dataProvider.addItem(image);
                this._source.removeItemAt(0);
            }

            protected function handleImageLoaded(event:Event):void
            {
                loadImage()
            }
        ]]>
    </fx:Script>
    <s:List
        id="lstImages"
        width="100%"
        dataProvider="{_dpImageList}"
        itemRenderer="path.to.render.ImageRenderer"
        skinClass="path.to.skins.ListSkin"
        >
        <s:layout>
            <s:HorizontalLayout gap="2" />
        </s:layout>
    </s:List>
</s:Application>

您的项目渲染器的图像的完整句柄将调度:

protected function handleImageLoaded(event:Event):void
{
    owner.dispatch(new Event("imageLoaded"));
}

这应该以干净的顺序加载您的图像。

于 2009-08-12T20:59:44.097 回答