2012-01-23 41 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被垃圾收集,你的适配器将被垃圾收集,这意味着你的视图将被收集。除非您对此行为有可衡量的问题,否则我不打算优化这一点。