需求
同一個ListView展示多種不同UI風格類型的Item
代碼實現
關鍵是重寫 getViewTypeCount() 和 getItemViewType(int position) 兩個方法。
private static final int TYPE1 = 0;
public static final int TYPE2 = 1;
@Override
public int getViewTypeCount() {
// 類型數量
return 2;
}
@Override
public int getItemViewType(int position) {
// 判斷返回不同的type類型
if (false) {
return TYPE1;
} else {
return TYPE2;
}
}
在getView()中進行判定,加載不同的佈局類型
if (TYPE1 == getItemViewType(position)) {
ViewHolder1 holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item1, parent, false);
holder = new ViewHolder1(convertView);
convertView.setTag(holder);
} else {
holder = (TitileViewHolder) convertView.getTag();
}
// 處理item1
} else if (TYPE2 == getItemViewType(position)) {
ViewHolder2 holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item2, parent, false);
holder = new ViewHolder2(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// 處理item2
}
return convertView;
注意:
1.類型的TYPE1、TYPE2必須從0到getViewTypeCount() - 1,否則報錯索引越界 ArrayIndexOutOfBoundsException
2.getItemViewType(int position)方法可以返回 IGNORE_ITEM_VIEW_TYPE,常量等於 -1。此類型表示Item的convertView不會被重用,每次都通過佈局創建。