Избегайте кэширования ItemRenders в списке Spark во Flex 4

У меня есть два списка Spark с настраиваемыми средствами визуализации элементов. Я работаю над приложением, которое позволяет пользователям перетаскивать эти средства визуализации элементов из одного списка в другой. Когда один из этих IR удаляется в новую позицию или в другой список, я обновляю поставщики данных: я удаляю объект из поставщика данных одного списка и добавляю его в поставщик данных другого. Это работает нормально.

Проблема в том, что иногда IR кэшируется и не отображает правильную информацию на основе своих данных.

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


person oscarm    schedule 11.09.2010    source источник


Ответы (3)


У Flextras есть несколько хороших моментов, но чтобы ответить на ваш конкретный вопрос, вы можете установить для useVirtualLayout значение false в Spark Lists. Это обеспечит наличие средства визуализации для каждого элемента в вашем списке и, таким образом, избежит проблем с повторным использованием. На самом деле вам следует делать это только тогда, когда у вас относительно короткий список элементов, иначе у вас будут проблемы с производительностью, которые, как заметил Флекстрас, являются причиной того, что Flex повторно использует рендереры.

person Wade Mueller    schedule 12.09.2010

Несколько вещей..

1) ItemRenderers всегда следует кэшировать [и повторно использовать]. Это одно из преимуществ использования списка Flex в первую очередь. Я подозреваю, что ваш itemRenderer реализован неправильно и не меняется при изменении данных. Если вы поделитесь кодом для этого, это будет полезно. Но, по сути, ваш itemRenderer должен прослушивать событие dataChange, и при изменении данных вы должны обновлять визуальное отображение компонента новыми данными.

2) В Flex 3 я бы поклялся, что перетаскивание элемента из одного списка в другой автоматически обновляет соответствующие dataProvider. Вы уверены, что вам нужно написать код вручную, чтобы внести эти изменения? Тем не менее, вам понадобится код для обновления вашего бэкэнда по мере необходимости.

person JeffryHouser    schedule 11.09.2010
comment
Хорошее предложение добавить код для принудительной перерисовки события DataChange, у меня был список из 50 элементов, ItemREnderer содержал больше компонентов, и один из них нарисовал себя с помощью объекта Graphics, из-за кеширования этот компонент не обновлялся, а другие компоненты, такие как Labels обновлено - person simion314; 11.06.2011

Я помещаю метод сброса в свои данные набора, чтобы обеспечить повторную инициализацию переменных рендерера

 override public function set data(object:Object):void
 {

if (object == null)
{
    return;
}

reset(); // reset locals to their base. ie. x=0, y=0, counter=0

    // set up renderer using data        

 }
person Patrick    schedule 24.09.2013