android viewholder模式,android – 对ViewHolder模式和convertView感到困惑

我是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值