我是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.
我感到困惑的地方是我认为convertView,如果不是null,将被重新使用,然后将View数据填充到其中并返回.
如果是这种情况,那么如何依赖代码中调用的setTag / getTag方法呢?似乎必须检索相同的对象才能使其工作?
解决方法:
perhaps view returned from getTag on a subsequent call is for a different list item, and returns the wrong view
适配器使用RecycleBin.此类允许ListView仅创建适合屏幕的行布局,加上一个或两个用于滚动和预加载.因此,如果您有一个包含1000行的ListView和一个仅显示7行的屏幕,则赔率是ListViiew将只有8个唯一的视图.
现在使用上面的示例来解决您的问题:只创建了八个行布局和8个后续ViewHolders.当用户滚动时,不会创建新的行布局;只有行布局的内容发生变化.因此getTag()将始终具有引用相应视图的有效ViewHolder.
(这有帮助吗?)
标签:android,android-adapter
来源: https://codeday.me/bug/20190718/1493948.html