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) 

Почему он так себя ведет, не понимая.

Спасибо за любую помощь.

Solutions Collecting From Web of "Java.lang.IndexOutOfBoundsException: неверный индекс 2, размер 2"

Вы пытаетесь выполнить операцию в Same ArrayList из-за этого, когда когда-либо вы удаляете элемент из массива ArrayList, тогда его размер уменьшится, вы получите ArrayIndexoutofBoundsException . Т.е. когда вы удаляете элемент из appAdp.list , тогда размер appAdp.list также изменится

Подумайте, имеет ли ваш список изначально 3 элемента.

У вас есть позиция в вашем posList 0,2

appAdp.list , когда вы удаляете элемент из элемента 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 выше индекса массива, поэтому вы получаете исключение из пределов

Ошибка: 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--; } 

Прежде чем вы измените источник данных адаптера, вы можете вызвать notifyDataSetInvalidated() адаптера, чтобы источник источника происхождения был недействительным, а затем вызвал notifyDataSetChanged() после завершения изменения источника данных.