web-dev-qa-db-fra.com

java.lang.IndexOutOfBoundsException: index non valide 2, la taille est 2

Scénario:-

J'ai deux ArrayList 

liste contient des images 

postList contient la position des images sélectionnées

À chaque fois que je sélectionne les images et que j'appuie sur le menu Supprimer, les images sélectionnées doivent être supprimées.

quand je lance le code dans debug, cela fonctionne bien et donne la sortie désirée.

mais quand je cours en mode normal, sa chute et donner ci-dessus 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;

valeurs postList ici

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

erreur montrant ici 

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)

pourquoi il se comporte comme ça, sans rien savoir.

Merci pour toute aide.

15
Unknown

Vous essayez d’exécuter une opération sur Same ArrayList à cause de cela, chaque fois que vous supprimez un élément de ArrayList, sa taille sera réduite, vous obtiendrez donc ArrayIndexoutofBoundsException. c'est-à-dire que lorsque vous supprimez un élément du appAdp.list, la taille du appAdp.list changera également

considérez si votre liste a initialement 3 elemnts.

vous avez la position dans votre posList 0,2

puis, lorsque vous supprimez un élément de l'élément 0 de appAdp.list, sa taille devient 2 lors de la prochaine tentative d'extraction de l'élément à la position 2. Vous obtiendrez alors AIOBE

Solution:

Enregistrez tous les éléments devant être supprimés dans une liste séparée et utilisez la méthode removeAll(list) pour supprimer les éléments de votre appAdp.list.

Exemple:

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

Et alors

appAdp.list.removeAll(templist);
17
Pragnani

rappelez-vous que les index partent de zéro. Je pense que quand vous obtenez une position, il est +1 plus élevé que l'index du tableau

0
Ragaisis

L'erreur est Invalid index 2, size is 2

Le problème possible est votre posList.size()=2 où en tant que appAdp.list.size()<2

Assurez-vous que votre appAdp.list a plus de deux entrées.

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

La signification de base de l'exception Java.lang.IndexOutOfBoundsException: Index x non valide, taille est y où x et y sont respectivement la position et la taille de l'index, ce qui signifie que vous essayez d'obtenir une valeur à une position inexistante. Prenons par exemple un ArrayList de taille 2 . En général, vous voudriez obtenir une ou des valeurs en spécifiant l'index de position qui, dans ce cas, la position valide serait 0 ou 1 et finit par spécifier un position 2 (l'index 2 n'existe pas). Je crois que la compréhension du sens fondamental des erreurs Java vous fera gagner un temps précieux dans votre développement.

0
brownwood

Avant de modifier la source de données de l'adaptateur, vous pouvez appeler la fonction notifyDataSetInvalidated() de l'adaptateur pour invalider la source de données Origin, puis appeler la notifyDataSetChanged() de l'adaptateur après avoir modifié la source de données.

0
DysaniazzZ