2010-08-17 4 views
1

Я пытаюсь создать вложенный список в Flex, который будет динамически изменяться, чтобы отображать всех детей при изменении поставщика данных.Изменение размера вложенных mx: списки для отображения всех элементов списка

Вот упрощенный пример, который иллюстрирует эту проблему:

<mx:Script> 
    <![CDATA[ 
     import mx.collections.ArrayCollection; 

     [Bindable] 
     public var outer:ArrayCollection = new ArrayCollection(["one", "two", "three"]); 

     [Bindable] 
     public var inner:ArrayCollection = new ArrayCollection([]); 

     public function addInnerListItems() : void { 
      inner.addItem("fish"); 
      inner.addItem("mice"); 
      inner.addItem("cats"); 
      inner.addItem("bats"); 
     } 
    ]]> 
</mx:Script> 

<mx:Button label="Add inner list items" click="addInnerListItems()" /> 

<mx:List dataProvider="{outer}" rowCount="{outer.length}"> 
    <mx:itemRenderer> 
     <mx:Component> 
      <mx:VBox> 
       <mx:Label text="{this.data}" /> 
       <mx:List dataProvider="{outerDocument.inner}" rowCount="{outerDocument.inner.length}"> 
        <mx:itemRenderer> 
         <mx:Component> 
          <mx:Label text="{this.data}" /> 
         </mx:Component> 
        </mx:itemRenderer> 
       </mx:List> 
      </mx:VBox> 
     </mx:Component> 
    </mx:itemRenderer> 
</mx:List> 

Размеры списка остаются неизменными при добавлении элементов.

Если я добавлю variableRowHeight="true" во внешний список, тогда внутренние списки будут правильно изменяться. Но внешний список сам по себе остается фиксированным.

Как я могу автоматически изменить размер обоих списков для отображения всех детей?

Спасибо! Stu

ответ

1

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

Затем переопределите updateDisplayList() в компоненте, который содержит внедренный список, чтобы отсортировать верхний список с измереннымWidth и measurdHeight.

Я бы не принял этот подход легко. ЕСЛИ вы это сделаете, вы будете отображать все элементы на экране, что отрицательно сказывается на преимуществах утилизации рендеринга при использовании класса List в первую очередь.

+0

Спасибо за ответ! Когда вы говорите «вычислять значения, как если бы все элементы списка отображались на экране в полном размере», вы имеете в виду (грубо говоря), что я умножаю количество элементов на некоторое заданное значение статической высоты? Я предполагаю, что не могу запросить элементы для их фактической высоты, если они уже не отображаются на экране. Или я ошибаюсь? – stubotnik

+0

ЕСЛИ вы используете variableRowHeight, вам придется перебирать все itemRenderers в списке и вычислять измеренный вес, добавляя измеренный вес каждого средства визуализации. Возможно, вам нужно будет прочитать жизненный цикл Flex Component и как Flex создает компоненты и их детей: http://livedocs.adobe.com/flex/3/html/help.html?content=ascomponents_advanced_2.html – JeffryHouser

+0

Еще раз спасибо. Я надеялся на то, что вы предлагаете, но я подумал, что это невозможно после того, как я прочитал это в описании метода listToItemRenderer() класса List: «Поскольку средства визуализации элементов существуют только для элементов в пределах набора видимых строк, вы не можете использовать это метод для элементов, которые не видны ». Это то, что вы имели в виду, или есть еще один способ привлечь моих детей к списку, чтобы я мог их измерить? – stubotnik

Смежные вопросы