Подтвердить что ты не робот

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)

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

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

4b9b3361

Ответ 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() после завершения изменения источника данных.