當列表顯示並滾動時,ListAdapter.getView()或者創建一個新的列表項視圖,或者重新傳遞給它的現有視圖(如「convertView」)以顯示新內容。從ListAdapter獲取緩存的視圖
我想知道,如果有一種方法來獲取所有由getView()創建的視圖嗎?例如,如果列表項視圖需要在活動被銷燬時釋放一些資源,那麼通過所有列表項視圖並告訴他們釋放資源
當列表顯示並滾動時,ListAdapter.getView()或者創建一個新的列表項視圖,或者重新傳遞給它的現有視圖(如「convertView」)以顯示新內容。從ListAdapter獲取緩存的視圖
我想知道,如果有一種方法來獲取所有由getView()創建的視圖嗎?例如,如果列表項視圖需要在活動被銷燬時釋放一些資源,那麼通過所有列表項視圖並告訴他們釋放資源
嗯,這是不那麼簡單,使用ListView#getChildAt(int)
通過ListView
迭代 - 的ListView
是AbsListView
子類 - 和AbsListView
實現用於保存View
s表示將重用RecycleBin
。
一個View
之前被放置在其RecycleBin
使用ViewGroup#detachViewFromParent(View)
其父(列表視圖)脫離,從而使用getChildAt(int)
使其不可訪問。
你應該實現的是RecyclerListener
界面,當View
被移動到RecycleBin
時會通知你。
由於ListView
是ViewGroup
,你應該能夠重複上孩子的看法是這樣的:
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
}
除非您的適配器在本活動之外使用(在這種情況下,您並不真正知道您不再需要這些視圖嗎?),否則您對此適配器的唯一引用在活動內。這意味着如果你的Activity被垃圾收集,你的適配器將被垃圾收集,這意味着你的視圖將被收集。除非您對此行爲有可衡量的問題,否則我不打算優化這一點。
但是,這隻會給我目前顯示的視圖,而一些視圖可能被緩存但未顯示。 – SVD
你說的對。 Jens對實施RecyclerListener的回答是更好的答案。我不知道這樣的事情存在,但它應該正是你需要的。 –