@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubCacheView cacheView;System.out.println(position+"======"+(convertView==null));if (convertView == null) {convertView = inflater.inflate(R.layout.list_item, null);cacheView = new CacheView(convertView);cacheView.setTag(position); //用於測試convertView.setTag(cacheView);} else {cacheView = (CacheView) convertView.getTag();}System.out.println("cacheView.tag==="+cacheView.getTag());}
上面的代碼是adapter 中重寫 getView ,一般情況下我們會通過上面的實現來最佳化listView。 對與每個item都先判斷 convertView是否為空白。 但到底這個convertView是什麼東東??
開始的時候我以為convertView就是每一項的view,每項的convertView之間沒有關係。 如果是這樣的話那每項第一次出現的時候convertView都為空白。但實際不是這樣的。把上面的代碼跑一遍就知道了。 那到底convertView是什麼呢? 來看張圖
ListView先請求一個type1視圖(getView)然後請求其他可見的項目。convertView在getView中是空(null)的。
當item1滾出螢幕,並且一個新的項目從螢幕低端上來時,ListView再請求一個type1視圖。convertView此時不是空值了,它的值是item1。你只需設定新的資料然後返回convertView,不必重新建立一個視圖。
(如果 item1的邊緣仍然可見(在頂端) convertView仍然是空值,因為recycler中沒有視圖)
就是這個樣子!!
如果想實現奇數行和偶數行顯示不同的顏色的功能,那應該怎麼做呢?開始的時候我是這麼做的:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = position % 2;
if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case 0:
convertView = mInflater.inflate(R.layout.item1, null);
holder.textView = (TextView)convertView.findViewById(R.id.text);
break;
case 1:
convertView = mInflater.inflate(R.layout.item2, null);
holder.textView = (TextView)convertView.findViewById(R.id.textSeparator);
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
holder.textView.setText(getItemViewType(position)+"");
return convertView;
}
顯然,通過上面的操作我們知道 只 這樣做是不行的。 會出現錯亂。 不過也很好解決。 我們只需要重寫 BaseAdapter 的 getItemViewType(int) 和
getViewTypeCount()即可。
getItemViewType(int) 官方解釋: get the type of View that will be create by getView(int,View,ViewGroup) for the specified item.
@Override
public int getItemViewType(int position) {
if(position % 2 == 0 ){
return 0;
}
return 1;
@Override
public int getViewTypeCount() {
return TYPE_MAX_COUNT;
}
系統每次調用getView的時候都會去調getItemViewType。getViewTypeCount()方法只會調用一次.
謝謝 這篇文章: http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html