Android listview 在OnItemClick初出现下标越界 java.lang.IndexOutOfBoundsException

以前自己写代码,在listview 中的这个方法中没有出现过什么问题,今天莫名其妙的在点击直接崩溃程序,查看好久找不到原因,最后打出来下标就明白啦

点击listview item时会遇到  Java.lang.IndexOutOfBoundsException: Invalid index 6, size is 6 问题的原因如下:

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
这里的下标是从1开始的,结束的位置是list数据源的大小,然而list获取数据list.get(i)的下标是从0开始到数据源的大小;adapter 中list的数据集合长度已经发生变化,但是没有notifydatasetchange(),呈现在listview中数据还是list集合改变之前。自己的做法是将下标整体减一

于是自己就加个判断将下标减一 if(i<checkBeans.size()&&checkBeans.size()>0){

                    bundle.putParcelable("bean", checkBeans.get(i-1) );
//                    bundle.putParcelable("bean", checkBeans.get(i));
                }
这样问题解决啦。

在网上看别人的解决方式:有一种还是很好的

 出现原因 有可能是 adapter 中list的数据集合长度已经发生变化,但是没有notifydatasetchange(),呈现在listview中数据还是list集合改变之前。

   在点击item时,触发 onitemclick事件:

@Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
               Goods goods = goodsList.get(position);

        }
}

这种写法,有可能会引发 java.lang.IndexOutOfBoundsException;但是也有可能会导致item呈现的内容,和点击item后的详情中呈现的内容不一致。


针对以上问题的解决方法:


1).在工程values文件夹下定义ids.xml文件    

<resources>

    <item type="id" name="tag_first"></item>
    <item type="id" name="tag_second"></item>
</resources>

2)adapter中 给 convertView 绑定数据  

         convertView.setTag(R.id.tag_first,holder);//绑定holder 缓存的复用

        convertView.setTag(R.id.tag_second, goods);//绑定数据

3)在onitemclick事件中通过getTag()方法得到要点击的数据:

@Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Goods goods =  (Goods)  view.getTag(R.id.tag_second); //得到每个item绑定的数据

        }
}

通过以上的修改,就不会出现 数组越界的问题,也不会出现数据错乱的问题了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值