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 puis-je utiliser Android dexOptions?
  • Utilisation d'AdB Logcat avec un véritable téléphone (et non l'émulateur)
  • Comment puis-je obtenir des liens hypertextes cliquables dans AlertDialog à partir d'une ressource de chaîne?
  • Utilisation de NanoHTTPD dans Android
  • Qu'est-il arrivé à Android aapt?
  • Quelle est la manière correcte de spécifier des dimensions dans DIP à partir du code Java?
  • 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.

  • Android: Dex ne peut pas analyser la version 52 byte code
  • "Impossible de résoudre: com.android.support:support-v4:26.0.0" et d'autres erreurs similaires sur la synchronisation de Gradle
  • Layout relatif alignParentLeft vs alignParentStart
  • Gradle build failing after update to Android studio 2.3 Canary 3
  • AVD ne démarre pas (SDK Tools 22.6.2)
  • Utilisation de FFmpeg avec Android-NDK
  • 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.