我有一个简单的代码片段,用于实现自定义列表视图。
我的代码如下:
WeatherAdapter.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);
}
}
}
我在Stack Overflow和其他网站上看到了很多答案,我理解了listview的回收机制。
我也明白了从viewholder中,我们可以在适配器中持有子视图,而不必多次调用findViewById()
。所以,这是为了优化。
但是我只对setTag(holder)
和getTag()
方法感到困惑。从这个问题中,我知道它是为了在多个对象上创建键值对,以便我们可以轻松访问它们。但是,我不明白为什么它们在这里是必需的...因为我们没有多个holder对象...只需要每次更改holder的变量。我们能够在这里编写代码而不使用setTag
和getTag
吗?
有人能更好地解释一下在这里setTag
和getTag
的作用吗?