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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章