Flex:ListItem从列表中的其他项目中提取数据?

时间:2009-04-24 13:55:17

标签: flex

我有一个带有自定义ItemRenderer的TileList,每个项目都显示一个图像,它从它从dataProvider接收的数据中提取出来。奇怪的是,我不知道为什么有些项目是显示图像不是在他们的数据块中,而是在另一个项目数据中。如果我从自己的数据中提取图像网址,我不知道如何从另一个项目获取图像网址。我使用了一个工具提示来显示图片网址和商品的数据,并验证了网址不在其数据中。

这是我正在使用的临时XML:

    <data>

        <bs item_id="1">
            <variation price="300" month="JAN" stone="Garnet" image="<?=$img_dir?>jan.png" style="xsdfcSD" gold_color="Yellow" gold_carat="10"/>
            <variation price="400" month="FEB" stone="Garnet" image="<?=$img_dir?>feb.png" style="xsdfcSD" gold_color="Yellow" gold_carat="10"/>
            <variation price="550" month="MAR" stone="Garnet" image="<?=$img_dir?>march.png" style="xsdfcSD" gold_color="Yellow" gold_carat="10"/>
            <variation price="625" month="APR" stone="Garnet" image="<?=$img_dir?>april.png" style="xsdfcSD" gold_color="Yellow" gold_carat="10"/>
        </bs>

        <bs item_id="2">
            <variation price="300" month="JAN" stone="Garnet" image="<?=$img_dir?>jan.png" style="xsdfcSD" gold_color="Yellow" gold_carat="10"/>
            <variation price="400" month="FEB" stone="Garnet" image="<?=$img_dir?>feb.png" style="xsdfcSD" gold_color="Yellow" gold_carat="10"/>
            <variation price="550" month="MAR" stone="Garnet" image="<?=$img_dir?>march.png" style="xsdfcSD" gold_color="Yellow" gold_carat="10"/>
            <variation price="625" month="APR" stone="Garnet" image="<?=$img_dir?>april.png" style="xsdfcSD" gold_color="Yellow" gold_carat="10"/>
        </bs>

        <bs item_id="3">
            <variation price="300" month="JAN" stone="Garnet" image="<?=$img_dir?>jan.png" style="xsdfcSD" gold_color="Yellow" gold_carat="10"/>
            <variation price="400" month="FEB" stone="Garnet" image="<?=$img_dir?>feb.png" style="xsdfcSD" gold_color="Yellow" gold_carat="10"/>
            <variation price="550" month="MAR" stone="Garnet" image="<?=$img_dir?>march.png" style="xsdfcSD" gold_color="Yellow" gold_carat="10"/>
            <variation price="625" month="APR" stone="Garnet" image="<?=$img_dir?>april.png" style="xsdfcSD" gold_color="Yellow" gold_carat="10"/>
        </bs>

        <bs item_id="4">
            <variation price="300" month="JAN" stone="Garnet" image="<?=$img_dir?>PE105-BT.png" style="xsdfcSD" gold_color="Yellow" gold_carat="10"/>
            <variation price="400" month="FEB" stone="Garnet" image="<?=$img_dir?>PE105-EM.png" style="xsdfcSD" gold_color="Yellow" gold_carat="10"/>
            <variation price="550" month="MAR" stone="Garnet" image="<?=$img_dir?>PE105-OP.png" style="xsdfcSD" gold_color="Yellow" gold_carat="10"/>
            <variation price="625" month="APR" stone="Garnet" image="<?=$img_dir?>PE105.png" style="xsdfcSD" gold_color="Yellow" gold_carat="10"/>
        </bs>


</data>

每个项目得到一个&lt; bs&gt;块。 (4项)

以下是ItemRender的代码:

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="150" height="150" xmlns:local="*">

    <mx:Script>
        <![CDATA[
            import mx.controls.Alert;

            private var _randomIndex:uint;
            private var _indexSet:Boolean;

            private function getRandomImage ():String
            {
                if (!_indexSet)
                {
                    var maxIndex:uint = data.children().length();
                    _randomIndex = Math.floor(Math.random()*maxIndex);
                    _indexSet = true;
                }
                return data.children()[_randomIndex].@image;
            }

        ]]>
    </mx:Script>


    <local:LoadingImage id="tn" toolTip="{tn.source+'\n\n'+data}" source="{getRandomImage()}" width="150" height="150"/>

</mx:Canvas>

第二个和第三个显示仅在第四个区块中的图像。

有人看到我没看到的东西吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

Itemrenderers是循环使用的,所以如果你在set data()中进行任何处理,你应该总是匹配if / else语句。您不能假设itemrender中的成员变量处于“已知”状态。在您的代码中,看起来indexSet未正确初始化+ if语句中没有其他内容。

答案 1 :(得分:0)

什么时候调用getRandomImage? ItemRenderer被重复使用,因此它们可能附有旧图像。如果您没有使用新值重新加载它,它仍将具有相同的图像。也许你可以尝试重载dataChanged事件?我也注意到你的_indexSet可能没有像上面所说的那样工作,但这不应该是你的主要问题。

答案 2 :(得分:0)

我发现如果我将“数据”传递给像getRandomImage(data)这样的函数,它就解决了这个问题。虽然不是100%肯定。