2013-05-09 129 views
13

场景: -java.lang.IndexOutOfBoundsException:无效索引2,尺寸为2

我有两个ArrayList

列表包含图像

postList包含所选图像

的位置现在当我选择图像并按删除菜单时,它应该删除所选图像。

当我在debug运行的代码,其工作正常,并给出欲望输出。

但是,当我运行它正常模式下,其崩溃并给予以上exception

if (posList.size() > 0) 
{ 
    Toast.makeText(getBaseContext(), "i value" +posList.size(), 
        Toast.LENGTH_SHORT).show(); 
    for (int i = 0; i < posList.size(); i++) 
     appAdp.list.remove(appAdp.list.get(posList.get(i))); 
    appAdp.notifyDataSetChanged(); 
    posList.clear(); 
    Toast.makeText(getBaseContext(), "You deleted selected items", 
        Toast.LENGTH_SHORT).show();    
} 
return true; 

postList值这里

@Override 
     public void onItemCheckedStateChanged(ActionMode mode, int position, long id, 
       boolean checked) { 
      posList.add(position); 

错误这里展示

appAdp.list.remove(appAdp.list.get(posList.get(i))); 

logcat的: -

java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2 

at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 

at java.util.ArrayList.get(ArrayList.java:304) 

为什么它的行为就像这样,没有得到任何线索。

感谢您的任何帮助。

回答

16

您正在尝试在因为同样的ArrayList中进行操作时,无论您在删除ArrayList中elemnt那么它的规模将减少的话,你会得到ArrayIndexoutofBoundsException。 即,当您从appAdp.list中删除项目时,则appAdp.list的大小也将更改

请考虑您的列表最初是否包含3个元素。

你有你的posList 0,2

那么当你从0项目从appAdp.list删除项目的位置,它的大小将成为2下一次,当你尝试2位置删除项目,你将得到AIOBE

解决方案:

保存,需要在单独的清单中删除的所有项目和使用removeAll(list)方法去除从appAdp.list

示例项目:

ArrayList<yourappListtype> templist=new ArrayList<yourappListtype>(); 
for (int i = 0; i < posList.size(); i++) 
     templist.add(appAdp.list.get(posList.get(i))); 

然后

appAdp.list.removeAll(templist); 
+0

最新的解决方案.. – Unknown 2013-05-09 11:22:01

+0

@CobraAjgar新增的解决方案 – Pragnani 2013-05-09 11:22:45

+0

这是我的另一个列表只有posList .... – Unknown 2013-05-09 11:23:04

0

请记住索引从零开始。我想你时,你得到的位置,它比数组的索引更高+1,所以你得到越界异常

+1

我有6个图像,我可以选择其中的任何一个,它返回相同的,如果我选择5那么它应该把第5个位置放在0 index.but为什么异常 – Unknown 2013-05-09 11:09:58

0

的错误是Invalid index 2, size is 2

可能的问题是你posList.size()=2其中作为appAdp.list.size()<2

确保您的appAdp.list有两个以上的条目。

if (posList.size() >0) 
i=appAdp.list.size(); 
while(i<=posList.size() && i<=appAdp.list.size()) 
{ 
appAdp.list.remove(appAdp.list.get(posList.get(i))); 
i--; 
} 
+0

“另外,如果(posList.size )> 0)从1开始检查而不是0.所以If条件应该是if(posList.size()> = 0)。但这不是问题,这是合乎逻辑的问题。这是错误的。 – 2013-05-09 11:16:24

+0

@AsierAranbarri是的,我忘了 – 2013-05-09 11:18:56

0

在更改适配器的数据源,可以调用适配器的notifyDataSetInvalidated()功能,使源数据源无效,则在完成数据源更改后请拨打电话适配器notifyDataSetChanged()

相关问题