我有一個簡單的代碼片段來實現自定義列表視圖。在ViewHolder模式中,setTag和getTag的作用是什麼?
我的代碼如下:
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);
}
}
}
我看到的SO和其他許多答案網站和我瞭解listview的回收機制。
我也理解,從視圖中,我們可以在適配器中容納子視圖,我們不必多次調用findViewById()
。所以,這是爲了優化。
但我只在setTag(holder)
和getTag()
方法混淆。 From this question,我開始知道它是用於在多個對象上創建鍵值對,以便我們可以輕鬆訪問它們。但是,我不明白他們爲什麼需要在這裏...因爲我們沒有多個持有者對象......只有我們每次都必須更改持有者的變量。我們可以在這裏編碼而不使用setTag
和getTag
?
任何人都可以更好地解釋什麼setTag
和getTag
做「這裏」?
請不要標記爲重複...我已經看到這麼多的答案,但無法找到特定情況下的權利。 – xyz 2014-09-22 04:25:11
爲什麼不試試你的方式,看看結果是什麼? – panini 2014-09-22 04:35:11
我已經試過...我沒有問任何問題沒有試過..如果你知道,那麼請給出答案 – xyz 2014-09-22 04:37:53