Adapter中getView的理解!

阿達King哥發表於2013-05-09
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {


ViewHolder holder;
if (convertView==null) {//一開始,顯示在螢幕內的item都沒有進入Recyclor,所以,convertView作為老的View是空的。
convertView=LayoutInflater.from(context).inflate(R.layout.group_item_view, null);//建立了一個View之後,這些convertView就會進入Recyclor,而Recyclor的大小依據螢幕上顯示物件的多少而定。
holder=new ViewHolder();

convertView.setTag(holder);//在View中繫結一個tag,作為附加的資料。

holder.groupItem=(TextView) convertView.findViewById(R.id.groupItem);

}
else{
holder=(ViewHolder) convertView.getTag();
}
holder.groupItem.setText(list.get(position));//該holder已經被convertView作為tag繫結。所以在此改的值也會在convertView中的tag中改變。相當於指標物件或者C#中的值型別的概念。

return convertView;//這個時候返回的convertView就是已經被重新賦值後的View了。只不過型別還是老的View的型別。

}


static class ViewHolder {//匿名內部類,使用的是靜態類
TextView groupItem;
}

上述的方法主要是考慮到如果有1億個物件的時候,不可能老是在建立View物件。因為對於一個操作來講,一般listview中的每個item總是一個相同的控制元件,可以把螢幕中顯示的控制元件物件儲存的記憶體中,而跟螢幕大小相同的控制元件物件儲存在Recyclor中,如果螢幕上請求新的item,那麼直接從recyclor中取原來老的那個item,只不過把老的item裡面的值改變一下,就可以了。

相關文章