«Предварительные измерения» Flex Flex Components - PullRequest
1 голос
/ 12 июня 2009

Я реализую пользовательский компонент Flex, который обеспечивает прокручиваемую точку обзора в (возможно, очень большой) сетке данных. Я использую шаблон ItemRenderer, так что у меня есть только UIComponents для элементов, видимых на экране в данный момент времени. Другими словами, что-то похожее на стандартный элемент управления DataGrid.

Одно требование, которое у меня есть, - это динамическое изменение размеров ячеек сетки в соответствии с предоставленными данными, чтобы ширина столбцов и высота строк были известны заранее. (Ширина столбца и высота строки не могут колебаться, поскольку пользователь прокручивает и появляются новые ячейки.)

Это требование подразумевает фазу «предварительного измерения» всей сетки, которая должна выполняться при изменении компонента dataSource или itemRenderer компонента. Я хотел бы использовать стандартные операции измерения компонентов Flex для выполнения этой фазы предварительного измерения.

Моя текущая стратегия для этого этапа предварительной оценки заключается в следующем:

  • Получить экземпляр itemRenderer
  • Инициализация itemRenderer
  • Для каждой ячейки в источнике данных:
    • Установить объект данных dataRenderer на данные этой ячейки
    • 'commitProperties ()' для компонента
    • 'measure ()' компонент
    • Обновлять ширину столбца / высоту строки в соответствии с результатами измерений

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

Поэтому я призываю более опытных, чем я, слова мудрости:

  • Есть мысли о целесообразности этой стратегии?
  • Любые предложения о том, как я мог бы элегантно использовать каркас для выполнения этого измерения для меня?
  • Есть ли лучшие стратегии для определения размера ячейки?

Ответы [ 2 ]

1 голос
/ 12 июня 2009

Я немного изучил код фреймворка, и если первоначальные результаты являются указанием, это не так больно, как я опасался. Внутренности этого:

var renderer:IListItemRenderer = getRenderer();
renderer.initialize();
for each (var cell:Object in cells) {
    renderer.data = cell;
    renderer.validateProperties();
    renderer.validateSize(true);
    // Access renderer's size properties here
}

Передача флага 'recursive = true' для validateSize - это ключ, который я пропустил ранее. К сожалению, для validateProperties нет эквивалентного флага, поэтому мне, вероятно, придется реализовать его самостоятельно, чтобы сделать его надежным для произвольных ItemRenderers.

0 голосов
/ 13 июня 2009

Я никогда не применял itemRenderers таким образом, поэтому не уверен, насколько это будет влиять на ваш подход, но вы устанавливаете

super.data = data

в верхней части установщика данных вашего рендерера? то есть:

override public function set data(value:Object):void
{
super.data = value;
...
}

Если нет, вы можете попробовать добавить это и посмотреть, устраняет ли это необходимость в рекурсивном флаге в validateProperties().

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