Средство отображения элементов списка Flex - PullRequest
0 голосов
/ 05 февраля 2012

Я создал список искров для рендерера элементов в flex, но я хочу вызывать функцию при добавлении новой строки в список, а не после.Я получаю объект данных в представленном списке, в нем я получаю тип данных для отображения в списке, т.е.либо текст, либо изображение.Поэтому при добавлении новых данных в список я хочу, чтобы в отображаемом списке была вызвана функция, которая проверяет тип полученных данных, а затем создает или добавляет элемент изображения или текстовый элемент.Таким образом, основная проблема заключается в том, как я получаю функцию, вызываемую при добавлении данных.Я пробовал такие события, как datachange и добавил, но они продолжают вызывать функцию снова и снова, когда мы прокручиваем список, но я хочу, чтобы функция вызывалась один раз только при добавлении данных, а не после защиты.Ниже приведен код списка рендерера, может быть, вы получите лучшее представление о том, что я пытаюсь сделать:

<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" dataChange="test_add()">

    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;
            public function test_add() : void {
                Alert.show("type="+data.msg_type);      
                if(data.msg_type=="text"){
                    //code to create and add new text element to list_row//
                }
                if(data.msg_type=="image"){
                    //code to create and add new image element to list_row//
                }
            }

        ]]>
    </fx:Script>

    <s:Group id="list_row" width="100%" verticalAlign="middle"  verticalCenter="0">

    </s:Group>
</s:ItemRenderer>

Любая помощь будет высоко оценена.Спасибо

1 Ответ

1 голос
/ 05 февраля 2012

Насколько я могу судить из кода, который вы показываете, самым простым решением вашей проблемы было бы работать с двумя отдельными ItemRenderers: один для визуализации текста, а другой для изображений.Вы можете сделать это, используя SkinnableDataContainer # itemRendererFunction вместо itemRenderer.

Список с новым свойством:

<s:List id="myList" dataProvider="{dp}" 
        itemRendererFunction="getItemRenderer" />

Функция, которая возвращает фабрикудля правильного ItemRenderer.

private function getItemRenderer(item:Object):IFactory {
    if (item.msg_type == "text") 
        return new ClassFactory(MyTextItemRenderer);
    if (item.msg_type == "image") 
        return new ClassFactory(MyImageItemRenderer);
}

В этих двух различных ItemRenderers вы можете затем отображать ваши данные, как вы хотите.


Редактировать: почему все в порядке, чтособытие dataChange срабатывает каждый раз, когда вы прокручиваете.

На самом деле в вашем подходе нет ничего плохого в том, как вы его описываете, хотя я бы сказал, что подход itemRendererFunction позволяет лучше разделить проблемы.Я мог бы сказать вам, что вы можете отключить нежелательное поведение, просто установив для свойства List # useVirtualLayout значение false.

<s:List id="myList" dataProvider="{dp}" 
        itemRenderer="myItemRenderer" useVirtualLayout="false" />

Хотя это будет делать то, что вы просите (т.е. создайте ItemRenderers только один раз), это не будет хорошим советом.Есть веская причина, по умолчанию это свойство установлено на true.

Когда используется виртуальный макет, средства визуализации элементов создаются только тогда, когда они необходимы, то есть когда они появляются и должны отображаться пользователю.Это позволяет загружать тысячи предметов без потери производительности.

Допустим, вы загружаете 1000 объектов-значений: это не занимает много памяти или ЦП.Но теперь вы хотите их визуализировать.Если вы не используете виртуальный макет, средство визуализации элементов будет создано для всех из них заранее, что означает тысячи графических элементов и тысячи прослушивателей событий (сколько точно зависит от вашей настройки). * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1034 он имитирует 10 элементов визуализации элементов.Если пользователь прокручивает страницу вниз, будут созданы следующие 10, а те, которые только что исчезли из представления, будут удалены и, в конечном итоге, будут собирать мусор.Итак, вы видите: то, что вы, возможно, восприняли как нечто, что поначалу было плохо для производительности, на самом деле очень хорошая вещь.

Поэтому я бы посоветовал вам не делать то, что я только что сказал вам.Если, возможно, у вас не возникнет ситуация, когда вы знали, что в вашем Списке никогда не будет больше, чем очень ограниченное количество элементов.Тогда вы можете рассмотреть возможность не использовать виртуальный макет.

...