2010-08-17 65 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

覆蓋列表類並在您的新類中覆蓋度量方法來計算measuredWidth和measuredHEight以計算值,就好像所有列表項都以全尺寸在屏幕上渲染一樣。

然後覆蓋包含嵌入列表的組件中的updateDisplayList(),以將上部列表設置爲measuredWidth和measurdHeight。

雖然我不會輕易採取這種方法。如果你這樣做,你將在屏幕上渲染所有項目,這首先否定了使用List類的渲染器回收利益。

+0

感謝您的回覆!當你說「如同所有列表項目全屏顯示在屏幕上一樣計算值」時,你的意思是(大致)我是否將某些預定義的靜態高度值乘以元素數量?我假設我不能要求元素的實際高度,除非它們已經顯示在屏幕上。或者我錯了? – stubotnik 2010-08-17 11:37:19

+0

如果您使用的是variableRowHeight,您將不得不遍歷列表中的所有itemRenderer,並通過添加每個渲染器的measuredHeight來計算measuredHeight。您可能需要閱讀Flex Component LifeCycle以及Flex如何創建組件及其子代:http://livedocs.adobe.com/flex/3/html/help.html?content=ascomponents_advanced_2.html – JeffryHouser 2010-08-17 17:50:03

+0

再次感謝。我希望能有像你這樣的建議,但是我認爲在List類的indexToItemRenderer()方法描述中讀到這個後,這是不可能的:「因爲項目渲染器只存在於一組可視行中的項目,所以你不能使用這個方法爲不可見的項目。「這是你的想法還是有另一種方式來讓我的手在列表的孩子,所以我可以衡量他們? – stubotnik 2010-08-17 21:03:05