【发布时间】:2013-01-21 22:08:22
【问题描述】:
我是 Android 开发的新手,并且正在阅读一些示例代码。我从 Adapter 类(派生自 ArrayAdapter)中的示例代码中复制了一个方法,派生类除了文本视图外还有一个复选框:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View listItem = super.getView(position, convertView, parent);
CheckedTextView checkMark = null;
ViewHolder holder = (ViewHolder) listItem.getTag();
if (holder != null) {
checkMark = holder.checkMark;
} else {
checkMark = (CheckedTextView) listItem.findViewById(android.R.id.text1);
holder = new ViewHolder(checkMark);
listItem.setTag(holder);
}
checkMark.setChecked(isInCollection(position));
return listItem;
}
private class ViewHolder {
protected final CheckedTextView checkMark;
public ViewHolder(CheckedTextView checkMark) {
this.checkMark = checkMark;
}
}
示例代码是通过在 ViewHolder 对象中缓存 View 来优化 getView。
我感到困惑的是,我认为如果不是 null,convertView 将被重新使用,然后将 View 数据填充到其中并返回。
如果是这样的话,那代码中调用的setTag / getTag方法又如何依赖呢?似乎必须检索相同的对象才能使其工作?
【问题讨论】:
-
我不确定你在问什么。您不确定
convertView是什么以及它是如何提供给getView()的吗?您是否对适配器中的项目如何标记感到困惑?或者您不确定保持视图的工作原理? -
setTag 被调用来缓存数据,稍后在后续调用中调用 getTag 将其取回。我不明白如何保证我们拥有相同的对象,即可能在后续调用中从 getTag 返回的视图是针对不同的列表项,并返回错误的视图