Android 中管理视图重用的代码在哪里?
Posted
技术标签:
【中文标题】Android 中管理视图重用的代码在哪里?【英文标题】:Where is the code that manages View re-use in Android? 【发布时间】:2011-01-30 15:40:26 【问题描述】:在 android 中管理 View
重用的源代码在哪里?我可以想到这个过程的三个不同部分,但可能还有更多:
-
确定
View
是否有资格重复使用的逻辑
管理可重复使用的View
s 池的代码
从池中删除可重复使用的View
并重置其属性值以表示逻辑上不同的View
的代码
编辑:博文Developing applications for Android – gotchas and quirks 给出了以下示例:
public class PencilWise extends ListActivity
View activeElement;
// ...
@Override
public void onCreate ( Bundle savedInstanceState )
// ...
this.getListView( ).setOnItemClickListener ( new OnItemClickListener ( )
public void onItemClick ( AdapterView<?> parent, View view, int position, long id )
MyActivity.this.activeElement = view;
MyActivity.this.showDialog ( DIALOG_ANSWER );
);
showDialog
方法会显示答案对话框,需要知道用户打开了什么问题。问题是,当对话框打开时,传递给onItemClick
的视图可能已被重用,因此activeElement
将不再指向用户首先单击以打开对话框的元素!
【问题讨论】:
对于需要视图重用的地方,Android 通常有一些基础设施来帮助解决这个问题。一个例子是使用 AdapterViews/Adapter,例如 ListView 和 BaseAdapter。除此之外,我不确定这里真正要问的是什么。 @Jeremy:见https://jonhoo.wordpress.com/2010/07/17/developing-applications-for-android-gotchas-and-quirks/。我不清楚,但我不是在谈论,例如,Adapter
实现通过检查getView
的convertView
参数是否非null
来重用列表项视图的能力。我说的是以某种方式内置的视图重用。
@Jeremy:我想这段代码在platform/frameworks/base 的某个地方,但我不知道在哪里。
【参考方案1】:
视图回收由AbsListView
及其子类ListView
和GridView
执行。你可以在这里找到这些类的源代码:https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/widget
以ListView
和AbsListView
开头。
【讨论】:
【参考方案2】:我认为您正在寻找的一个很好的例子是位于 widget
包中的 AbsListView.RecycleBin
内部类。
您可以在此处在线查看代码:
https://android.googlesource.com/platform/frameworks/base/+/android-2.2_r1.1/core/java/android/widget/AbsListView.java#3888
这是文档的摘录:
RecycleBin 有助于跨布局重用视图。回收站有两个级别 存储:ActiveViews 和 ScrapViews。 ActiveViews 是那些在屏幕上显示的视图 布局的开始。通过构建,他们正在显示当前信息。在......的最后 布局,ActiveViews 中的所有视图都降级为 ScrapViews。 ScrapViews 是旧的视图 适配器可能会使用它来避免不必要地分配视图。
【讨论】:
以上是关于Android 中管理视图重用的代码在哪里?的主要内容,如果未能解决你的问题,请参考以下文章