Android面試必問的Listview getview方法問題

今天看到了一篇文章,講解Listview的getView最清晰的,順便自己也記錄一下。。。
1、每一次都重新定義一個View載入佈局,加載數據,該種方式是最慢的一種

public View getView(int position, View convertView, ViewGroup   parent) { 
View item = mInflater.inflate( R.layout.list_item_icon_text, null); 
((TextView) item.findViewById( 
R.id.text)).setText(DATA[position]); 
((ImageView) item.findViewById( R.id.icon))
.setImageBitmap( (position & 1) == 1 ?
mIcon1 : mIcon2); 
return item; 
} 

2、採用通過判斷參數convertView是爲NULL,再加載

    public View getView(int position, View convertView, ViewGroup parent) { 
if (convertView == null) { 
convertView = mInflater. inflate(R.layout.item, parent, false); 
} 
((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]); 
((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap( (position & 1) == 1 ? mIcon1 : mIcon2); 
return convertView; 
} 

該種方法放判斷convertView爲null時,纔會去向第一種方式一樣,不爲空的時候直接重新使用convertView從而減少了很多不必要的View的創建,然後加載數據。(不爲NULL的數據是暫存於RecycleBin中的)
3、ViewHolder方式,通過定義一個ViewHolder,將convetView的tag設置爲ViewHolder,不爲空時重新使用即可
//條目的佈局文件中有什麼組件,這裏就定義什麼屬性

    static class ViewHolder { 
    TextView text; 
    ImageView icon; 
    }

    public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder;
     if (convertView == null) {
    convertView = mInflater.inflate(R.layout.list_item_icon_text,          parent, false);
    holder = new ViewHolder();
    //把佈局文件中所有組件的對象
    //封裝至ViewHolder對象中  
   holder.text = 
    (TextView) convertView
    .findViewById(R.id.text);
holder.icon = 
    (ImageView) convertView
    .findViewById(R.id.icon);
    //把ViewHolder對象封裝至View對象中
convertView.setTag(holder);
} 
else {
    holder = (ViewHolder) convertView.getTag();
}
    //給組件設置內容
holder.text.setText(DATA[position]);
holder.icon.setImageBitmap(
    (position & 1) == 1 ?
     mIcon1 : mIcon2);
return convertView;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章