java.lang.IndexOutOfBoundsException:索引2无效,大小为2

时间:2013-05-09 11:04:07

标签: android arraylist

场景: -

我有两个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)

为什么它表现得像这样,没有任何线索。

感谢您的帮助。

6 个答案:

答案 0 :(得分:17)

您正在尝试对Same 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);

答案 1 :(得分:1)

尝试此代码,

postList.remove(position);

然后

notifyItemRangeChanged(positon,postList.size());

答案 2 :(得分:0)

记住索引从零开始。我认为你获得位置时它比数组索引高+1,所以你得出界限异常

答案 3 :(得分:0)

错误为Invalid index 2, size is 2

可能的问题是您的posList.size()=2appAdp.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--;
}

答案 4 :(得分:0)

在更改适配器的数据源之前,您可以调用适配器的notifyDataSetInvalidated()功能使原始数据源无效,然后在完成更改后调用适配器的notifyDataSetChanged()数据来源。

答案 5 :(得分:0)

异常的基本含义 java.lang.IndexOutOfBoundsException:无效的索引x,大小为y ,其中x和y分别是索引位置和大小,表示您试图在某个位置获取值那不存在。以大小为2的ArrayList 为例,通常您希望通过指定位置索引来获取值,在这种情况下,有效位置将为0或1 并最终指定位置2(索引2不存在)。我相信了解Java错误的基本含义将为您节省很多宝贵的开发时间。