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.
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);
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
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--;
}
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.
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.