17

设想:-

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

日志猫:-

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)

为什么它的行为如此,没有任何线索。

谢谢你的帮助。

4

6 回答 6

21

您正在尝试对 Same ArrayList 执行操作,因为当您从 ArrayList 中删除元素时,它的大小会减小,因此您会得到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);
于 2013-05-09T11:20:20.093 回答
2

试试这个代码,

postList.remove(position);

然后,

notifyItemRangeChanged(positon,postList.size());

于 2018-11-05T05:22:44.827 回答
1

在修改adapter的数据源之前,可以调用adapter的notifyDataSetInvalidated()函数使源数据源失效,然后notifyDataSetChanged()在修改数据源后调用adapter的。

于 2017-05-27T09:04:16.650 回答
0

请记住,索引从零开始。我认为您在获取位置时比数组的索引高 +1,因此您会超出范围异常

于 2013-05-09T11:07:13.557 回答
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--;
}
于 2013-05-09T11:11:06.720 回答
0

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

于 2018-09-17T12:56:21.123 回答