Android ListView 多样式Item的一个注意点:(

时间:2023-03-09 07:28:53
Android ListView 多样式Item的一个注意点:(

闲来无事,在写一个多样式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;

(ಥ _ ಥ)