Android ListView tableau index hors limites après filtre

Je pense que c'est une question pour les experts.

Je reçois des appels pour getView() avec positon hors limites à partir de la liste de données ListView .
Cela se produit lorsque j'utilise le filtre adaptateur. La publishResults() filter publishResults() remplit les données avec une liste filtrée qui est plus petite que la liste d'origine.
L'erreur semble se produire lorsque la nouvelle liste filtrée est plus courte que la liste filtrée précédente . J'ai changé le code de getView() pour renvoyer un faux ConvertView lorsque hors limites, juste pour voir combien de ces appels sont émis.

  • Comment générer des APK signés et non signés en utilisant gradle?
  • Compiler FFMPEG pour l'utilisation de la ligne de commande
  • Recevoir des données pour un système d'URL personnalisé dans Android
  • Android: lecture d'un son actif à l'aide de WebView
  • JQuery.mobile popup se cache immédiatement après avoir montré
  • Gérer une réponse vide dans un JSONRequest avec Volley
  • Ce sont le code pertinent et les messages de log j'ai enregistrés:

      @Override public View getView(int position, View convertView, ViewGroup parent) { // No logs here to keep ListView performance good Log.d(TAG, "+ getView( position=" + position + ")"); ViewHolder holder; if( position >= mData.size() ) { // This code allows to see how many bad calls I get Log.w(TAG, "position out of bounds!"); convertView = mInflater.inflate(mLayout, parent, false); return convertView; } . . . // Normal getView code return convertView; } 

    Dans le filtre (code copié tel que le code source ArrayAdapter )

      @Override protected void publishResults(CharSequence constraint, FilterResults results) { Log.pe(TAG, "+ publishResults(constraint:" + constraint + ", results.count:" + results.count + ")"); //noinspection unchecked mData = (ArrayList<String>) results.values; if (results.count > 0) { notifyDataSetChanged(); } else { notifyDataSetInvalidated(); } Log.px(TAG, "- publishResults()"); } 

    Le fichier journal montre qu'après un filtre avec 7 résultats, un éventler avec 3 résultats, mais getView conserve des appels pour 7 éléments (j'ai marqué avec *** les appels hors limites):

     02-26 05:31:55.986: D/ViewerActivity(22857): + onQueryTextChange(newText:log) 02-26 05:31:55.986: D/ViewerActivity(22857): - onQueryTextChange() 02-26 05:31:56.029: D/LogScreenAdapter(22857): + performFiltering(prefix:log) 02-26 05:31:56.113: D/dalvikvm(22857): GC_CONCURRENT freed 378K, 5% free 13577K/14215K, paused 0ms+1ms 02-26 05:31:56.153: D/LogScreenAdapter(22857): - performFiltering() 02-26 05:31:56.153: D/LogScreenAdapter(22857): + publishResults(constraint:log, results.count:7) 02-26 05:31:56.167: D/LogScreenAdapter(22857): - publishResults() 02-26 05:31:56.167: D/LogScreenAdapter(22857): + getView( position=0) 02-26 05:31:56.167: D/LogScreenAdapter(22857): + getView( position=0) 02-26 05:31:56.167: D/LogScreenAdapter(22857): + getView( position=0) 02-26 05:31:56.167: D/LogScreenAdapter(22857): + getView( position=1) 02-26 05:31:56.167: D/LogScreenAdapter(22857): + getView( position=2) 02-26 05:31:56.167: D/LogScreenAdapter(22857): + getView( position=3) 02-26 05:31:56.167: D/LogScreenAdapter(22857): + getView( position=4) 02-26 05:31:56.167: D/LogScreenAdapter(22857): + getView( position=5) 02-26 05:31:56.167: D/LogScreenAdapter(22857): + getView( position=6) 02-26 05:31:56.167: D/LogScreenAdapter(22857): + getView( position=0) 02-26 05:31:56.167: D/LogScreenAdapter(22857): + getView( position=1) 02-26 05:31:56.167: D/LogScreenAdapter(22857): + getView( position=2) 02-26 05:31:56.167: D/LogScreenAdapter(22857): + getView( position=3) 02-26 05:31:56.167: D/LogScreenAdapter(22857): + getView( position=4) 02-26 05:31:56.493: D/LogScreenAdapter(22857): + getView( position=5) 02-26 05:31:56.503: D/LogScreenAdapter(22857): + getView( position=6) 02-26 05:32:23.793: D/ViewerActivity(22857): + onQueryTextChange(newText:logs) 02-26 05:32:23.793: D/ViewerActivity(22857): - onQueryTextChange() 02-26 05:32:23.813: D/LogScreenAdapter(22857): + performFiltering(prefix:logs) 02-26 05:32:23.854: D/dalvikvm(22857): GC_CONCURRENT freed 383K, 5% free 13577K/14215K, paused 0ms+0ms 02-26 05:32:23.924: D/dalvikvm(22857): GC_CONCURRENT freed 388K, 5% free 13573K/14215K, paused 0ms+1ms 02-26 05:32:23.974: D/LogScreenAdapter(22857): - performFiltering() 02-26 05:32:23.983: D/LogScreenAdapter(22857): + publishResults(constraint:logs, results.count:3) 02-26 05:32:23.983: D/LogScreenAdapter(22857): - publishResults() 02-26 05:32:23.983: D/LogScreenAdapter(22857): + getView( position=0) 02-26 05:32:24.074: D/LogScreenAdapter(22857): + getView( position=0) 02-26 05:32:24.093: D/LogScreenAdapter(22857): + getView( position=0) 02-26 05:32:24.113: D/LogScreenAdapter(22857): + getView( position=1) 02-26 05:32:24.155: D/LogScreenAdapter(22857): + getView( position=2) 02-26 05:32:24.164: D/LogScreenAdapter(22857): + getView( position=3) *** 02-26 05:32:24.193: W/LogScreenAdapter(22857): position out of bounds! 02-26 05:32:24.233: D/LogScreenAdapter(22857): + getView( position=4) *** 02-26 05:32:24.263: W/LogScreenAdapter(22857): position out of bounds! 02-26 05:32:24.284: D/LogScreenAdapter(22857): + getView( position=5) *** 02-26 05:32:24.313: W/LogScreenAdapter(22857): position out of bounds! 02-26 05:32:24.333: D/LogScreenAdapter(22857): + getView( position=6) *** 02-26 05:32:24.343: W/LogScreenAdapter(22857): position out of bounds! 02-26 05:32:24.353: D/LogScreenAdapter(22857): + getView( position=0) 02-26 05:32:24.373: D/LogScreenAdapter(22857): + getView( position=1) 02-26 05:32:24.383: D/LogScreenAdapter(22857): + getView( position=2) 02-26 05:32:24.403: D/LogScreenAdapter(22857): + getView( position=3) *** 02-26 05:32:24.413: W/LogScreenAdapter(22857): position out of bounds! 02-26 05:32:24.433: D/LogScreenAdapter(22857): + getView( position=4) *** 02-26 05:32:24.443: W/LogScreenAdapter(22857): position out of bounds! 02-26 05:32:24.463: D/LogScreenAdapter(22857): + getView( position=5) *** 02-26 05:32:24.475: W/LogScreenAdapter(22857): position out of bounds! 02-26 05:32:24.483: D/LogScreenAdapter(22857): + getView( position=6) *** 02-26 05:32:24.503: W/LogScreenAdapter(22857): position out of bounds! 02-26 05:38:26.769: D/dalvikvm(22857): GC_CONCURRENT freed 316K, 5% free 13640K/14215K, paused 0ms+1ms 

    Ce que vous voyez ici, la méthode publishResults() a changé mData d'une liste de 7 éléments à une liste plus courte de 3 éléments, voir le code ci-dessus, mais l' Adapter continue d'obtenir les getView() pour la liste des 7 éléments, même cela Ce n'est plus là.
    Notez que notifyDataSetChanged() a été appelé avec la nouvelle affectation de données, de sorte que ListView doit être au courant de la nouvelle liste.

  • Le caractère Hindi ne s'affichera pas correctement dans la vue Web
  • Utilisation de l'éditeur de préférences partagées
  • Android onBackStackChanged () non appelé
  • SearchView getActionView renvoie null
  • Xamarin: Impossible d'ouvrir une session pour la machine virtuelle Nexus 7 (Lollipop)
  • Android - Comma en tant que séparateur décimal sur le clavier numérique
  • 3 Solutions collect form web for “Android ListView tableau index hors limites après filtre”

    Qu'est-ce que vous public int getCount() méthode public int getCount() de l'adaptateur de liste de liste personnalisée?

    Vous devriez retourner comme mData != null? mData.size() : 0 mData != null? mData.size() : 0 ,

    La position de la caution est en raison du fait que vous renvoyez la taille de la liste plus que les données à afficher dans la liste

    getCount() méthode de l'adaptateur de liste personnalisée de getCount() spécifie la taille de la vue de la liste, de sorte qu'il devrait s'agir de la taille des données que vous passez dans la liste

    On dirait que la méthode "getCount ()" résoudra votre problème:

     @Override public int getCount() { return mData.size(); } 

    Je l'ai fait et j'ai résolu mes problèmes

     @Override public int getCount() { if (isFiltered == true) { return myFilteredArray.size(); } return myUnfilteredArray.size(); } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.