2010-09-11 70 views
2

我有兩個帶有自定義Item Renderer的Spark列表。我正在開發一個應用程序,使用戶能夠將這些Item Renderer從一個List拖動到另一個List。當其中一個IR被放置在新的位置或另一個列表中時,我正在更新數據提供者:我從一個列表的數據提供者中刪除該對象,並將其添加到另一個數據提供者。這工作正常。避免ItemRenders在Flex中的Spark列表中緩存4

問題是,有時IR會被緩存,並且它不會根據其數據顯示正確的信息。

如何強制列表永不緩存IR,以便每次修改數據提供者時,所有項目渲染都會重新創建所有IR。由於每個列表上的項目都很少,因此性能不會成爲問題。

回答

1

Flextras有一些優點,但要回答您的具體問題,可以在Spark Lists上將useVirtualLayout設置爲false。這將確保列表中的每個項目都有渲染器,從而避免了回收問題。當你有一個相對較短的項目列表時,你應該只做這件事,否則你會遇到性能問題,就像Flextras指出的那樣,是Flex回收渲染器的原因。

+0

完美工作。謝謝。 – oscarm 2010-09-13 20:48:24

3

有幾件事情..

1)的itemRenderer應始終緩存[和重用。這是首先使用Flex列表的好處之一。我懷疑你的itemRenderer是不正確實現的,以便在數據發生變化時不會改變。如果你分享一些代碼,這將是有益的。但是,基本上,itemRenderer應該監聽dataChange事件,當數據發生變化時,您應該使用新數據更新組件的可視化顯示。

2)在Flex 3中,我會發誓將一個項目從一個列表拖到另一個列表會自動更新相關的數據提供程序。您確定需要編寫手動代碼來進行這些更改嗎?不過,您需要使用代碼更新後臺。

+0

很好的建議添加代碼來強制重繪上dataChange事件,我有50個元素的列表,的itemRenderer包含多個組件和其中一個使用Graphics對象繪製自己,因爲緩存該組件沒有更新,但其他組件像標籤更新 – simion314 2011-06-11 13:53:01

0

我把復位法在我的一組數據,以確保渲染變量被重新初始化

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   

}