Flex предотвращает повторное использование элемента рендерера? - PullRequest
0 голосов
/ 30 мая 2011

Есть ли способ предотвратить повторное использование элементов, отображаемых с помощью компонентов Spark в Flex 4.5?

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

Ответы [ 4 ]

3 голосов
/ 30 мая 2011

Во-первых, Я не рекомендую вам делать это . Рециркуляция предметов имеет важное значение для любого приложения Flex по соображениям производительности. Я предлагаю вам потратить время на то, чтобы разобраться, а не взламывать попытки создания приложения.

Но если вам нужно это сделать, вы всегда можете отключить виртуализацию в макете:

<s:List>
   <s:layout>
      <s:VerticalLayout useVirtualLayout="false" />
   <s:/layout>
</s:list>

По умолчанию виртуализация имеет значение true.

1 голос
/ 30 мая 2011

Вы устанавливаете полное состояние средства визуализации элементов с данными?Если вы рассчитываете состояние на основе данных и забыли очистить или сбросить его, вы получите некорректный вывод из-за повторного использования.Например:

public function set data(value:Object):void
{
     if (value.@blackBack == "true")
     {
          setStyle("backgroundColor", "black");
     }
}

Когда вы увидите это в первый раз, все будет в порядке - черные элементы черные.Но после того, как вы прокрутите список, вы будете получать повторно использованные предметы с черным фоном везде.Решение всегда установить стиль на какое-то значение.Объясните подробнее о своей проблеме, может, она такая же?

0 голосов
/ 30 мая 2011

Я не знаю, помогает ли это, но прежде, чем познакомиться с ItemRenderers, мы использовали для создания n-количество экземпляров пользовательских компонентов и вызывали метод addChild() контейнера, чтобы добавить их на экран.Переработка не происходит, все экземпляры компонентов создаются и добавляются на сцену.Не очень хорошая идея, если у вас очень большое количество объектов.

for(var i:int = 0; i < numComponents; i++)
{
    var customComponent:CustomComponent = new CustomComponent();
    // set properties to the customComponent, like data, width etc...
    vBox.addChild(customComponent);
}

Установите vBox как <mx:VBox id="vBox"/>

, если вы хотите сбросить элементы, вызовите vBox.removeAllChildren() иповторите цикл для их добавления.

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

Надеюсь, это поможет.

0 голосов
/ 30 мая 2011

Насколько я знаю, невозможно предотвратить повторное использование элементов визуализации.

Относительно того, как работает утилита рендеринга элементов, позвольте мне дать краткое объяснение:

Предположим, у вас есть компонент на основе списка (например, List, DataGrid и т. Д.) В вашем приложении. Вы показываете, скажем, 100 строк данных (в любом формате, который вы хотите). В большинстве случаев, из-за ограничений экранного пространства и для лучшего удобства использования вы не будете показывать 100 строк одновременно. Вместо этого вы будете показывать, скажем, 10 строк (используя свойство rowCount или назначая компоненту определенную высоту), а также использовать полосы прокрутки для просмотра остальных items. Таким образом, в любой момент времени из 100 строк у вас есть 10 видимых строк, а остальные 90 - вне экрана. Сохранение экземпляров средств визуализации элементов 90 закадровых строк в памяти, в то время как вы можете просматривать только 10 строк одновременно, не Хорошая практика исполнения. То, что делает гибкий фреймворк, заключается в том, что он создает средства визуализации для видимых строк (в данном случае 10) плюс еще 2 или 3 дополнительных средства визуализации (я не уверен, насколько точно). Фреймворк создает только 13 экземпляров средства визуализации элементов. Во время прокрутки фреймворк повторно использует уже созданные средства визуализации элементов для отображения. закадровые строки, передавая свойство данных этой конкретной строки в элемент рендеринга элемента. Другими словами, 14-я строка будет повторно использовать средство визуализации элементов, созданное для первой строки, 15-я строка будет повторно использовать 2-ю строку, 16-я будет повторно использовать 3-ю и т. д. , прокручивая вниз.

Надеюсь, что поможет

...