2013-05-09 6 views
13

Szenario: -java.lang.IndexOutOfBoundsException: Ungültige Index 2, Größe 2

Ich habe zwei ArrayList

Liste enthält Bilder

postList enthält Position ausgewählter Bilder

jetzt Wann immer ich die Bilder auswähle und das Löschen-Menü drücke, sollte es die ausgewählten Bilder löschen.

Wenn ich den Code in debug laufen lasse, funktioniert es gut und gibt die Wunschausgabe.

aber wenn ich es normalen Modus laufen lasse, stürzt es ab und gibt über 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 Werte hier

@Override 
     public void onItemCheckedStateChanged(ActionMode mode, int position, long id, 
       boolean checked) { 
      posList.add(position); 

Fehler hier

appAdp.list.remove(appAdp.list.get(posList.get(i))); 

logcat zeigt: -

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) 

warum wie diese seine verhalte, keine Ahnung zu bekommen.

Danke für jede Hilfe.

Antwort

16

Sie versuchen, den Betrieb auf derselben Arraylist durchzuführen, weil der, dass, wann immer Sie entfernen sind elemnt aus der Arraylist dann seiner Größe so reduzieren, Sie ArrayIndexoutofBoundsException zu bekommen. , d. H., Wenn Sie Artikel aus der appAdp.list entfernen, dann wird die Größe der appAdp.list auch ändern

prüfen, ob Ihre Liste ursprünglich 3 Elemente hat.

Sie haben die Position in Ihrem posList 0,2

dann, wenn Sie Artikel aus dem 0 Artikel von appAdp.list entfernen, wird seine Größe 2 für das nächste Mal, wenn Sie versuchen, Artikel zu 2 Position zu entfernen, Sie erhalten AIOBE

Lösung:

speichert alle Elemente, die in separater Liste und die Verwendung removeAll(list) Verfahren entfernt werden muss, entfernen Elemente aus Ihrem appAdp.list

Beispiel:

ArrayList<yourappListtype> templist=new ArrayList<yourappListtype>(); 
for (int i = 0; i < posList.size(); i++) 
     templist.add(appAdp.list.get(posList.get(i))); 

Und dann

appAdp.list.removeAll(templist); 
+0

was ist die Lösung .. – Unknown

+0

@CobraAjgar Lösung hinzugefügt – Pragnani

+0

das ist meine andere Liste nur posList .... – Unknown

0

Denken Sie daran, dass der Index von Null beginnt. Ich glaube, Sie, wenn get Position es +1 höher als Index der Array ist, so erhalten Sie außerhalb der Grenzen Ausnahme

+1

ich habe 6 Bilder, ich kann jedes von ihnen auswählen, es gibt das gleiche zurück, wenn ich 5 auswähle, dann sollte es die 5. Position in Index 0 setzen.aber warum die Ausnahme – Unknown

0

Der Fehler ist Invalid index 2, size is 2

Mögliches Problem ist Ihr posList.size()=2 wo als appAdp.list.size()<2

Achten Sie darauf, dass Ihr appAdp.list hat mehr als zwei Einträge.

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

"auch, wenn (posList.size ()> 0) checks von 1 nicht 0. Also sollte die If-Bedingung sein if (posList.size()> = 0). Aber das ist nicht das Problem, das ist logisches Problem ". Das ist einfach falsch. –

+0

@AsierAranbarri ja, ich vergaß –

0

Bevor Sie die Datenquelle des Adapters ändern, können Sie Adapters notifyDataSetInvalidated() Funktion aufrufen, die Herkunft Datenquelle ungültig zu machen, dann Rufen Sie den Adapter notifyDataSetChanged() nach dem Ändern der Datenquelle.

Verwandte Themen