2012-01-23 70 views
0

當列表顯示並滾動時,ListAdapter.getView()或者創建一個新的列表項視圖,或者重新傳遞給它的現有視圖(如「convertView」)以顯示新內容。從ListAdapter獲取緩存的視圖

我想知道,如果有一種方法來獲取所有由getView()創建的視圖嗎?例如,如果列表項視圖需要在活動被銷燬時釋放一些資源,那麼通過所有列表項視圖並告訴他們釋放資源

回答

4

嗯,這是那麼簡單,使用ListView#getChildAt(int)通過ListView迭代 - 的ListViewAbsListView子類 - 和AbsListView實現用於保存View s表示將重用RecycleBin

一個View之前被放置在其RecycleBin使用ViewGroup#detachViewFromParent(View)其父(列表視圖)脫離,從而使用getChildAt(int)使其不可訪問。

你應該實現的是RecyclerListener界面,當View被移動到RecycleBin時會通知你。

0

由於ListViewViewGroup,你應該能夠重複上孩子的看法是這樣的:

需要在這個問題類似
for (int i=0; i < myListView.getChildCount(); i++) { 
    View v = myListView.getChildAt(i); 

    //Check to see if this view has the resource, then release it 
} 

東西:Android: Access child views from a ListView

+1

但是,這隻會給我目前顯示的視圖,而一些視圖可能被緩存但未顯示。 – SVD

+0

你說的對。 Jens對實施RecyclerListener的回答是更好的答案。我不知道這樣的事情存在,但它應該正是你需要的。 –

0

這就是Java。您無法命令應用程序或實例真正銷燬以釋放資源。使用finalize(),你只能提高java機器執行它的概率。

+0

我不是在尋找一種立即銷燬東西的方法,但是當我確定它不再需要時(即在調用Activity的onDestroy時)釋放對資源的引用。 – SVD

+0

兩個變種之間有什麼區別:1. A可以釋放B和B可以釋放C. 2. B可以釋放C.? ----你讓這座建築物減少一層,但你不能抹去它。根據許多權威人士的說法,Android不支持你想要做的事情。 – Gangnus

0

除非您的適配器在本活動之外使用(在這種情況下,您並不真正知道您不再需要這些視圖嗎?),否則您對此適配器的唯一引用在活動內。這意味着如果你的Activity被垃圾收集,你的適配器將被垃圾收集,這意味着你的視圖將被收集。除非您對此行爲有可衡量的問題,否則我不打算優化這一點。