Flex: ListItem извлекает данные из других элементов списка? - PullRequest
0 голосов
/ 24 апреля 2009

У меня есть TileList с пользовательским ItemRenderer, и каждый элемент показывает изображение, которое он извлекает из данных, которые он получает от dataProvider. Странная вещь, и я понятия не имею, почему некоторые элементы показывают изображения, которые находятся не в их блоке данных, а в данных других элементов. Если я извлекаю URL-адрес изображения из его собственных данных, я понятия не имею, как можно получить URL-адрес изображения из другого элемента. Я использовал всплывающую подсказку, чтобы показать URL-адрес изображения и данные элемента, и убедился, что URL-адрес отсутствует в его данных.

Вот временный 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>

Каждый элемент получает блок . (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>

2-й и 3-й показывают изображения, которые находятся только в 4-м блоке.

Кто-нибудь видит то, чего я не вижу?

Спасибо!

Ответы [ 3 ]

1 голос
/ 24 апреля 2009

Itemrenderers перерабатываются, поэтому, если вы выполняете какую-либо обработку в set data (), вы всегда должны иметь соответствующие операторы if / else. Вы не можете предполагать, что переменные-члены в itemrender находятся в «известном» состоянии. В вашем коде похоже, что indexSet не инициализируется должным образом + в операторе if больше ничего нет.

0 голосов
/ 28 апреля 2009

Я обнаружил, что если я передаю «данные» в функцию, подобную этой getRandomImage (data), это решает проблему. Хотя не уверен на 100%, почему.

0 голосов
/ 24 апреля 2009

Когда вызывается getRandomImage? ItemRenderer повторно используются, поэтому к ним может быть прикреплено старое изображение. Если вы не перезагрузите его с новым значением, оно все равно будет иметь то же изображение. Может быть, вы могли бы попытаться перегрузить событие dataChanged? Я также заметил, что ваш _indexSet, вероятно, не работает так, как вы хотите, как указано выше, но это не должно быть вашей главной проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...