您的位置:首页 > 移动开发 > Android开发

Android ListView IndexOutOfBoundsException ViewHolder类型转化错误

2016-05-21 22:37 351 查看
问题一:

我们都知道,在用Listview展示多个类型的Type时候,适配器中需要重写getItemViewType(int position)类型和getViewTypeCount()类型总数,如图:


.


但是前几天在做listview展示多个类型的时候,出现了一个错误IndexOutOfBoundsException


找了好久就是不知道怎么回事,经过一天的艰难探索,终于找到了突破点。查看源码发现类型的position必须从0开始,如图


我的需求是reply == null加载一个布局,reply != null加载另一个布局,本以为getItemViewType(position);中的position可以随便写一个整数,结果导致了这个错误。

发现错误就要解决错误,只需要把getItemViewType(position)中的position修改为从0开始。即int posi = 0;这个错误完美解决。。

问题二:

但是接着运行程序之后又报了类型转化错误java.lang.ClassCastException: com.xingtong.qiaoyuer.adapter.v_1_1.SalonTalkAdapter$ViewHolder2 cannot be cast to com.xingtong.qiaoyuer.adapter.v_1_1.SalonTalkAdapter$ViewHolder1

大概意思就是ViewHolder2不能转化为ViewHolder1,原因就是数据源开始只有type==0类型的数据,所以这时候convertView已经被实例化了,convertView已经不为null了,但是我在listview上拉加载更多数据的时候,又会加载出第二个Type的即 type==1的数据源,此时再次执行到convertView的时候发现,convertView已经不为null了,就会直接从getTag()=ViewHolder2中取出ViewHolder2中的控件值,其实理论上应该走的是TYpe
==1,ConvertView==null 那么从新实例化ConvertView ,然后convertView.setTag(ViewHolder1);理想状态下应该是发现Type==1时,发现type==1的converView没有实例化,则先实例化,发现type
==0的convertView没有实例化,则先实例化。怎样才能做到一个type类型对应一个convertView呢?就是要在数据源的时候设置上Type的类型。如图2 


要是服务器返回的数据源带有类型就好了,就不用自己把list中的每一个对象都拿出来加上type然后再放进去了)。

其实在适配器Adapter执行的过程中先执行的getItemViewType(int position)方法和getViewTypeCount()类型总数方法,然后才走的getView()方法,所以形成了数据源的type一一对应的关系后,当它拿到一个bean对象的数据后发现Type和上一个bean对象的数据不一致,它就会重新初始化ConvertView,从新setTag(ViewHolder)。以此类推以后再遇到有相同类型的就直接拿以前的ViewHolder,如果没有就从新再次初始化ConvertView。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息