需求
同一个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不会被重用,每次都通过布局创建。