闲来无事,在写一个多样式Item的ListView的Demo时,遇到了一个以前没遇过的问题;
╮( ̄▽ ̄")╭
我们知道,ListView里可以有多种样式的item,
实现只需要重写:
@Override
public int getItemViewType(int position) {
int type = Integer.parseInt(mData.get(position).get(KEY_TYPE));
switch (type) {
case TYPE_HEADER:
return TYPE_HEADER; case TYPE_CONTENT:
return TYPE_CONTENT;
}
return super.getItemViewType(position);
} @Override
public int getViewTypeCount() {
return 2;
}
然后在getView()方法中做一些item的Type判断,做不同操作即可;
一切都那么美好;
---------------------------------------------------
然而,在我写这个Demo的时候发现,并不能随意给ItemViewType定义int值;
如:
public static final int TYPE_HEADER = 9;
public static final int TYPE_CONTENT = 1;
就会在随后的ListView使用时造成崩溃;
因为ListView会把不同的ItemViewType放进一个有序容器中,
而且这个容器的大小就是getViewTypeCount()方法返回的值,这里是2;
当复用TYPE_HEADER时,就会去取容器中的第9个元素,
然后:
java.lang.IndexOutOfBoundsException
没想到啊,这个居然是相关的;
而且Exception的printStackTrace()所显示的信息,都是sdk的类,简直难找问题源头;
---------------------------------------------------
所以,必须从0开始依次定义ItemViewType的值;
如:
public static final int TYPE_HEADER = 0;
public static final int TYPE_CONTENT_TEXT = 1;
public static final int TYPE_CONTENT_IMAGE = 2;
public static final int TYPE_FOOTER = 3;
(ಥ _ ಥ)