Erreur java.lang.IndexOutOfBoundsException: Invalid index 0, la taille est de 0 sur Android adaptateur
J'ai un adaptateur qui s'étend BaseAdapter dans mon activité. Dans l'adaptateur que j'ai la liste des enregistrements. Lorsque l'utilisateur clique sur n'importe quel enregistrement, les options sont répertoriées. Ces options sont "envoyer" et "supprimer". Supprimer les options supprimer enregistrement à partir de la liste et l'envoyer option envoyer l'enregistrement de serveur. Lorsque l'envoi est pressé , asynctask est commencé. Pour l'opération de suppression, j'utilise le gestionnaire de la boîte de dialogue.(Oui ou non).
Mon problème est que si j'appuie sur supprimer dans un enregistrement, tandis que d'autres dossiers sont à envoyer, l'application est en panne et j'ai eu cette excetion;
java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
at java.util.ArrayList.get(ArrayList.java:304)
E/AndroidRuntime(25140): atandroid.widget.HeaderViewListAdapter.isEnabled(HeaderViewListAdapter.java:164)
J'ai vérifié la taille de nombreuses fois, et la taille n'est pas 0. Je suis sûr que la taille n'est pas un problème.
Ce code est à partir de mon opération de suppression;
public class MyAdapter extends BaseAdapter{
CopyOnWriteArratList<MyObject> MyCopyonWriteArrayList;
private Handler handler;
private ListView listview;
public MyAdapter(Context context,
CopyOnWriteArratList<MyObject> MyCopyonWriteArrayList,ListView listView){
this.context = context;
this.MyCopyonWriteArrayList= MyCopyonWriteArrayList;
this.listView = listView;
}
new Thread(new Runnable() {
@Override
public void run() {
//If I remove this line, app does not crash
MyObject o = MyCopyonWriteArrayList.get(position);
o.Delete();
MyCopyonWriteArrayList.remove(position);
//Code arrive here.
}
handler.post(new Runnable() {
//Code cannot arrive here
@Override
public void run() {
progressDialog.dismiss();
deleteDoneListener.deleteDone();
}
});
}
}).start();
} catch (Exception e) {
e.printStackTrace();
}
Mon asyntask est très typique.
Ma question est que pourquoi j'ai eu cette exception "l'indice 0 , la taille 0"?. Cette taille n'est pas myarraylist taille.
Comment puis-je corriger ce code et quelle est la source de cette taille?
Aussi Si j'utilise asynctask au lieu de gestionnaire dans le supprimer, je l'ai eu "ne Peut pas créer de gestionnaire à l'intérieur de thread qui n'a pas appelé Looper.prepare()]" l'exception". Je ne peux donc pas mettre asyntack dans la boîte de dialogue.
vérifiez votre liste de tableaux MyCopyonWriteArrayList, utilisez logcat pour imprimer la liste de tableaux.
J'ai vérifié la liste de tableaux beaucoup de temps et la taille jamais 0.
Qu'essayez-vous de faire? Je pense que ce morceau de code n'est pas assez. Par exemple, je voudrais savoir où
MyCopyonWriteArrayList
est défini et où les éléments sont ajoutés.J'ai édité question et j'ai défini dans MyAdapter classe. J'ai passer les éléments de MyAdapter classe. Merci de me demander quelle partie avez-vous besoin d', je vais l'ajouter à la question.
OriginalL'auteur SavasCinar | 2012-12-21
Vous devez vous connecter pour publier un commentaire.
Il suffit de cocher la position se situe dans l'intervalle, si donc le supprimer et de faire des changements comme suit :
Certainement, il va vous aider à
OriginalL'auteur RajeshVijayakumar
Ce que je faisais, comment, et ce que j'ai eu sont presque les mêmes que les vôtres! Cela pourrait aider:
J'avais la même exception tout en utilisant l'adaptateur personnalisé avec ListView. Et d'exception a été levée à partir de Android standard de la bibliothèque de classes, pas même l'un des premiers à n'importe quelle ligne de mon code.
J'ai aussi été l'ajout d'en-Tête, de sorte que ma carte a été implicitement enveloppé par HeaderViewListAdapter.
Dans mon cas, le problème apparaît lorsque je suis à la suppression des données à partir de l'adaptateur.
Je pensais que le problème, c'est parce que ListView ou de l'adaptateur ne peut pas fonctionner correctement avec en-Tête, mais pour de vrai la raison en était les autres.
Ma solution est de s'assurer que l'adaptateur de données n'est jamais modifié à partir d'autres threads, et
notifyDataSetChanged()
est appelé à partir de l'UI thread.Donc, après résout tout fonctionne et mon code ressemble à ceci:
OriginalL'auteur B-GangsteR