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)
почему он так себя ведет, не понимая.
Спасибо за любую помощь.
Ответы
Ответ 1
Вы пытаетесь выполнить операцию в 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);
Ответ 2
помните, что индекс начинается с нуля. Я думаю, что вы, когда получаете позицию, на +1 выше индекса массива, поэтому вы получаете исключение из пределов
Ответ 3
Ошибка 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
Перед изменением источника данных адаптера вы можете вызвать функцию адаптера notifyDataSetInvalidated()
, чтобы источник источника происхождения был недействительным, затем нажмите адаптер notifyDataSetChanged()
после завершения изменения источника данных.