场景: -
我有两个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)
为什么它表现得像这样,没有任何线索。
感谢您的帮助。
答案 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()=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--;
}
答案 4 :(得分:0)
在更改适配器的数据源之前,您可以调用适配器的notifyDataSetInvalidated()
功能使原始数据源无效,然后在完成更改后调用适配器的notifyDataSetChanged()
数据来源。
答案 5 :(得分:0)
异常的基本含义 java.lang.IndexOutOfBoundsException:无效的索引x,大小为y ,其中x和y分别是索引位置和大小,表示您试图在某个位置获取值那不存在。以大小为2的ArrayList 为例,通常您希望通过指定位置索引来获取值,在这种情况下,有效位置将为0或1 并最终指定位置2(索引2不存在)。我相信了解Java错误的基本含义将为您节省很多宝贵的开发时间。