gpt4 book ai didi

android - 对 ViewHolder 模式和 convertView 感到困惑

转载 作者:太空宇宙 更新时间:2023-11-03 11:51:11 26 4
gpt4 key购买 nike

我是 Android 开发的新手,正在阅读一些示例代码。我从适配器类(派生自 ArrayAdapter)中的示例代码复制了一个方法,派生类除了 TextView 外还有一个复选框:

@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

适配器使用回收站。此类允许 ListView 仅创建适合屏幕的行布局,外加一两个用于滚动和预加载。因此,如果您有一个包含 1000 行的 ListView 和一个仅显示 7 行的屏幕,则 ListView 很可能只有 8 个唯一 View 。

现在使用我上面的例子回答你的问题:只创建了八个行布局和 8 个后续的 ViewHolder。当用户滚动时,不会创建新的行布局;只有行布局的内容发生变化。所以 getTag() 将始终有一个引用适当 View 的有效 ViewHolder。

(这有帮助吗?)

关于android - 对 ViewHolder 模式和 convertView 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14448126/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com