2013-05-09 4 views
13

Сценарий: -java.lang.IndexOutOfBoundsException: Invalid индекс 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) 

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

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

ответ

16

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

Рассмотрите, был ли ваш список изначально 3 elemnts.

у вас есть место в вашем 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); 
+0

какое решение .. – Unknown

+0

@CobraAjgar Добавлено решение – Pragnani

+0

это мой другой список только posList .... – Unknown

0

Помните, что индекс начинается с нуля. Я думаю, что вы когда позиция прибудет это +1 выше индекса массива, так что вы получите из исключения ограничивающей

+1

У меня есть 6 изображений, я могу выбрать любой из них, он возвращает то же самое, если я выбираю 5, тогда он должен поставить 5-ю позицию в 0 index.but, почему исключение – Unknown

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--; 
} 
+0

«Также, если (posList.size ()> 0) проверяет от 1 не 0. Таким образом, условие If должно быть, если (posList.size()> = 0). Но это не проблема, это логическая проблема ». Это просто неправильно. –

+0

@AsierAranbarri да, я забыл –

0

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

Смежные вопросы