android java. lang.索引越界异常:索引2无效,大小为2

liwlm1x9  于 2022-12-21  发布在  Android
关注(0)|答案(7)|浏览(170)

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

为什么它会这样,没有任何线索。
谢谢你的帮助。

zujrkrfu

zujrkrfu1#

您正在尝试对同一个数组列表执行操作,因为当您从数组列表中删除元素时,它的大小将减小,因此,您将得到ArrayIndexoutofBoundsException。即,当您从appAdp.list中删除项时,appAdp.list的大小也将更改
考虑一下你的列表最初是否有3个元素。
你的位置在你的位置列表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);
u0sqgete

u0sqgete2#

试试这个代码,
第一个月
然后,
notifyItemRangeChanged(positon,postList.size());

col17t5w

col17t5w3#

在更改适配器的数据源之前,可以调用适配器的notifyDataSetInvalidated()函数使源数据源无效,更改完数据源后再调用适配器的notifyDataSetChanged()函数。

sf6xfgos

sf6xfgos4#

记住索引是从零开始的。2我认为当你得到位置时,它比数组的索引高+1,所以你会得到越界异常

qkf9rpyu

qkf9rpyu5#

错误为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--;
}
2sbarzqh

2sbarzqh6#

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

wgmfuz8q

wgmfuz8q7#

只需在for循环末尾使用break命令,如下所示:

fun deleteUser(userID: Int) {
    for(i in 0 until usersList.size) {
        if (usersList[i].id == userID) {
            usersList.removeAt(i)
            notifyItemRemoved(i)
            break
        }
    }
}

相关问题