2013-02-27 17 views
10

Ich denke, das ist eine Frage für Experten.Android ListView Array-Index außerhalb der Grenzen nach Filter

Ich bekomme Anrufe zu getView() mit positonaußerhalb der Grenzen vom Listview Datenliste.
Dies passiert, wenn ich den Adapter-Filter verwende. Die Filtermethode publishResults() füllt die Daten mit einer gefilterten Liste, die kleiner als die ursprüngliche Liste ist.
Der Fehler scheint zu auftreten, wenn die neue gefilterte Liste kürzer ist als die vorherige gefilterte Liste. Ich habe den Code getView() geändert, um einen Dummy convertView zurückgeben, wenn außerhalb der Grenzen, nur um zu sehen, wie viele solcher Anrufe ausgegeben werden.

Dies sind der entsprechende Code und die log Nachrichten, die ich angemeldet:

@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; 
    } 

Im Filter (Code kopiert, wie aus ArrayAdapter Quellcode)

 @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()"); 
     } 

Die Protokolldatei zeigt, dass nach einem Filter mit 7 Ergebnissen, kommt ein Fitler mit 3 Ergebnissen, aber getView hält Aufrufe für 7 Elemente (ich markierte mit *** die außerhalb der Grenzen Anrufe):

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 

Was Sie hier sehen, die publishResults() Methode hat mdata aus einer Liste von 7 Artikel auf eine kürzere Liste von 3 Elemente ändern, sehen Sie den Code oben, aber die Adapter hält getView() fordert, dass die 7-Posten-Liste bekommen, auch dass es nicht mehr da ist.
Beachten Sie, dass notifyDataSetChanged() mit der neuen Datenzuweisung aufgerufen wurde, so dass die ListView die neue Liste kennen sollte.

+1

Wird die getItemCount-Funktion aufgerufen, und wenn ja, was wird zurückgegeben? Wenn Sie es außer Kraft setzen, geben Sie den Code ein. –

+1

Was gibt getItemCount zurück? – alex

+0

Ich überschreibe getItemCount nicht, sollte ich? – ilomambo

Antwort

20

, was Sie in public int getCount() Methode der benutzerdefinierten Listenansicht Adapter zurückkehren?

Sie kehren sollte wie mData != null? mData.size() : 0,

Position aus Bindung wird immer aufgrund können Sie Größe der Liste zurückkehren, werden mehr als Daten in der Liste anzuzeigen

getCount() Methode der benutzerdefinierten Liste Adaptergröße angibt der Listenansicht so sollte es die Größe der Daten, die Sie in der Liste vorbei sind

18

Scheint, wie überwiegende von "getCount()" Methode wird Ihr Problem lösen:

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

Vielen Dank ... +1 für diese – Noman

+0

+1, genau was benötigt wurde. – Mahm00d

+0

Diese Aussage existiert aber das gleiche Problem – Prasad

0

ich das tat und es meine Probleme gelöst

@Override 
public int getCount() { 

    if (isFiltered == true) { 
     return myFilteredArray.size(); 
    } 

    return myUnfilteredArray.size(); 
} 
Verwandte Themen