gpt4 book ai didi

android - ViewHolder 模式中的 setTag 和 getTag 的作用是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:49:44 27 4
gpt4 key购买 nike

我有一个用于实现自定义 ListView 的简单代码 fragment 。

我的代码如下:

天气适配器.java :

public class WeatherAdapter extends ArrayAdapter<weather>{

Context mcontext;
int mlayoutResourceId;
weather mdata[] = null;
View row;

public WeatherAdapter(Context context, int layoutResourceId, weather[] data) {
super(context, layoutResourceId, data);
mlayoutResourceId = layoutResourceId;
mcontext = context;
mdata = data;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
row = convertView;
WeatherHolder holder = null;

if(row == null)
{
LayoutInflater inflater = ( (Activity) mcontext).getLayoutInflater();
row = inflater.inflate(mlayoutResourceId, parent, false);

holder = new WeatherHolder(row);


row.setTag(holder);

}
else
{
holder = (WeatherHolder)row.getTag();
}

weather w = mdata[position];
holder.txtTitle.setText(w.mtitle);
holder.imgIcon.setImageResource(w.micon);

return row;
}

WeatherHolder.java:

class WeatherHolder
{
ImageView imgIcon;
TextView txtTitle;


public WeatherHolder(View v){

imgIcon = (ImageView)row.findViewById(R.id.imgIcon);
txtTitle = (TextView)row.findViewById(R.id.txtTitle);

}
}
}

在SO等网站上看到了很多答案,明白了listview的回收机制。

我还了解到,从 viewholder 中,我们可以在适配器中保存 subview ,而不必多次调用 findViewById()。所以,这是为了优化。

但我只对 setTag(holder)getTag() 方法感到困惑。 From this question ,我才知道它是为了在多个对象上做一个键值对,这样我们就可以方便地访问它们。但是,我不明白为什么这里需要它们……因为,我们没有多个持有人对象……只是我们每次都必须更改持有人的变量。我们可以在此处编码而不使用 setTaggetTag 吗?

谁能更好地解释一下 setTaggetTag “这里”做了什么?

最佳答案

tag 是一种让您的 views 记住某些东西的机制,它可以是 object 一个 integer a string 或您喜欢的任何内容。

因此,当您的 ListView 将首次创建时,您的 convertViewnull。所以你创建了一个新的 convertView 并将那个 rowobjects 的所有 references 放在 >viewHolder。然后将您的 viewHolder 保存到该 convertView(setTag) 的内存中。 Android 将你的 convertView 放入它的 pool回收通过再次给你。但是它的 pool 可能没有足够的 convertViews 所以它再次传递一个新的 convertView 那是 null。所以再次重复这个故事,直到 androidpool 被填满。之后 android 从它的池中获取一个 convertView 并将其传递给您。你会发现它不是null 所以你问它我第一次给你的对象references在哪里? (getTag) 这样您就可以获取这些标签并随心所欲。

下面一行的详细说明

但它的池可能没有足够的 convertView,所以它再次传递一个新的 convertView,它是 null

android pool 在您的 listView 将要创建时是空的。因此,对于您的 listView 的第一项,它会向您发送一个必须显示的 convertView。之后 android 将它保存在它的 pool 中,所以它的 pool 现在只包含一个 convertView。对于要创建的 listView 的第二个项目,android 不能使用它的池,因为它实际上有一个元素,而那个元素是你的第一个项目,它现在正在显示,所以它必须传递另一个 convertView。重复此过程,直到 android 在其 pool 中找到一个现在未显示的 convertView 并将其传递给您。

当你滚动它使用 holder 的列表时,Android 会膨胀每一行直到屏幕被填满。

关于android - ViewHolder 模式中的 setTag 和 getTag 的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25966689/

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