it-swarm.com.de

java.lang.IndexOutOfBoundsException: Ungültiger Index 2, Größe 2

Szenario:-

Ich habe zwei ArrayList 

liste enthält Bilder 

postList enthält die Position der ausgewählten Bilder

jetzt, wenn ich die Bilder auswähle und auf "Löschen" klicke, sollten die ausgewählten Bilder gelöscht werden.

wenn ich den Code in debug laufen lasse, funktioniert er einwandfrei und gibt die gewünschte Ausgabe aus.

aber wenn ich es normal laufe, stürzt es ab und gibt 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 angezeigt 

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)

warum es sich so verhält, keine Ahnung bekommt.

Danke für jede Hilfe.

15
Unknown

Sie versuchen, eine Operation für Same ArrayList auszuführen. Wenn Sie elemnt aus der ArrayList entfernen, verringert sich die Größe, und Sie erhalten ArrayIndexoutofBoundsException. Wenn Sie also Artikel aus dem appAdp.list entfernen, ändert sich auch die Größe des appAdp.list

Überlegen Sie, ob Ihre Liste ursprünglich 3 Elemente hat.

sie haben die Position in Ihrer posList 0,2

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

Lösung:

Speichern Sie alle Elemente, die entfernt werden müssen, in einer separaten Liste und verwenden Sie die Methode removeAll(list), um Elemente aus Ihrem appAdp.list zu entfernen.

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);
17
Pragnani

versuchen Sie diesen Code,

postList.remove(position);

dann,

notifyItemRangeChanged(positon,postList.size());

1
nithin joseph

denken Sie daran, dass der Index bei Null beginnt. Ich denke, wenn Sie die Position erhalten, ist sie um +1 höher als der Index des Arrays

0
Ragaisis

Der Fehler ist Invalid index 2, size is 2

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

Stellen Sie sicher, dass Ihr appAdp.list mehr als zwei Einträge enthält.

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

Die grundlegende Bedeutung der Ausnahme Java.lang.IndexOutOfBoundsException: Ungültiger Index x, Größe ist y, wobei x und y die Indexposition und -größe sind. Dies bedeutet, dass Sie versuchen, einen Wert an einer nicht vorhandenen Position abzurufen. Nehmen Sie zum Beispiel eine ArrayList mit der Größe 2. In der Regel möchten Sie Werte erhalten, indem Sie den Positionsindex angeben. In diesem Fall wäre die gültige Position entweder 0 oder 1 und würde am Ende ein a angeben Position 2 (Index 2 existiert nicht). Ich glaube, dass das Verständnis der Grundbedeutung von Java-Fehlern Ihnen wertvolle Zeit bei Ihrer Entwicklung erspart.

0
brownwood

Bevor Sie die Datenquelle des Adapters ändern, können Sie die notifyDataSetInvalidated()-Funktion des Adapters aufrufen, um die Origin-Datenquelle ungültig zu machen, und dann notifyDataSetChanged() des Adapters aufrufen, nachdem Sie die Datenquelle geändert haben.

0
DysaniazzZ