Насколько я могу судить из кода, который вы показываете, самым простым решением вашей проблемы было бы работать с двумя отдельными 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, а те, которые только что исчезли из представления, будут удалены и, в конечном итоге, будут собирать мусор.Итак, вы видите: то, что вы, возможно, восприняли как нечто, что поначалу было плохо для производительности, на самом деле очень хорошая вещь.
Поэтому я бы посоветовал вам не делать то, что я только что сказал вам.Если, возможно, у вас не возникнет ситуация, когда вы знали, что в вашем Списке никогда не будет больше, чем очень ограниченное количество элементов.Тогда вы можете рассмотреть возможность не использовать виртуальный макет.