当列表显示并滚动时,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的回答是更好的答案。我不知道这样的事情存在,但它应该正是你需要的。 –