2011-07-28 4 views
2

Je travaille sur une application qui consiste principalement en une vue de liste. Il est sauvegardé par mon propre adaptateur de matrice personnalisé dont la taille change toutes les 5 secondes. Si je fais défiler l'affichage de la liste lorsque l'adaptateur de tableau passe d'une taille supérieure à une taille inférieure, l'exception est hors limites. Cela a du sens pour moi pourquoi cela se produit (puisque je défile à une position au-delà de la nouvelle taille de tableau), mais je me demandais s'il y avait un bon moyen de le déboguer. Je ne peux pas arriver à une conclusion claire, et je me demandais si je pouvais obtenir de l'aide.Android - Faire défiler ListView conduit à l'exception «Out of Bounds»

mettre à jour l'adaptateur en utilisant la AsyncTask suivante ...

public class myTask extends AsyncTask<Void, Void, Void>{ 

     @Override 
     protected Void doInBackground(Void... params) { 
      while(isRunning){ 
       myData.clear(); 
       getData(); 
       publishProgress(); 
       SystemClock.sleep(5000); 
      } 
      return null; 
     } 

     protected void onProgressUpdate(Void...progress){ 
      listAdapter.notifyDataSetChanged(); 

     }  
} 

myData est le ArrayList qui prend en charge listAdapter et getData() est la fonction qui renseigne myData avec les informations pertinentes qui seront éventuellement affiché à mon avis la liste .

Existe-t-il un bon moyen de résoudre ce problème?

Cordialement

+0

Avez-vous écoute OnScroll? –

+0

Pourquoi faites-vous défiler jusqu'à une position que le tableau n'a pas? L'adaptateur devrait seulement retourner les éléments que vous avez, non? – dmon

+0

@Nikola, je n'ai pas d'écouteur onScroll, et je pensais juste que je devrais implémenter cela afin d'empêcher l'exception. dmon, Là réside mon problème, hehe. Si l'adaptateur passe d'une taille plus grande à une taille plus petite à un moment donné, je défile à une position supérieure à la taille la plus petite, c'est à ce moment que j'obtiens l'exception hors limites. – digitalmouse12

Répondre

0

Avez-vous essayé de réinitialiser l'utilisateur soit en haut de la liste ou le plus près possible lorsque la liste a changé les tailles?

+0

Oui, j'ai ... et l'erreur reste encore – digitalmouse12

2

Utilisez-vous un adaptateur personnalisé? Peut-être que dans vos getViewTypeCount() et getItemViewType (position int), il n'y a plus de limites. Le nombre de types de vue doit être de (0, n) mais le type de vue d'élément doit être [0, n).

E.g. le nombre de type de vue devrait être 2

Mais les types de vue doit être 0 et 1, pas 1 et 2.

+0

Merci beaucoup .. – Bharatesh

0

Désolé, est peut-être pas la réponse à la question, mais ayant cette boucle infinie me semble pour c'est pas la bonne façon, même si c'est une tâche asynchrone. Je voudrais essayer d'utiliser un AlarmManager ou un temporisateur. Cela dit, il semble que ce que vous avez est une condition de concurrence, prenez en compte que ce n'est pas immédiatement lorsque vous demandez des données, ou une position spécifique et reconstruire les vues.

Cheers, Francisco.

+0

Merci, Francisco. J'ai suivi votre conseil et essayé d'implémenter l'utilisation d'un Timer, mais j'ai toujours la même erreur. Il y a une condition de course en cours, et je pensais qu'un chronomètre le résoudrait. Néanmoins, cela se produit rarement. – digitalmouse12

2

essayer de remplacer la fonction getCount() de la classe d'adaptation:

@Override 
public int getCount() { 
return [list that contains data].size(); 
} 
+0

Merci. Je n'avais aucune idée de la raison pour laquelle ma listview était en train de sortir des limites. Cela fonctionnait bien à tout moment sauf quand j'étais rafraîchissant pour chercher. Merci encore! – Sufian

Questions connexes