Índice de matriz Android ListView fora dos limites após o filter

Penso que esta é uma questão paira especialists.

Recebo chamadas paira getView() com positon fora dos limites da list de dados ListView .
Isso acontece quando eu uso o filter Adaptador. O método filter publishResults() preenche os dados com uma list filtrada que é menor do que a list original.
O erro pairece ocorrer quando a nova list filtrada é menor do que a list filtrada anterior . Eu mudei o código do getView() paira retornair um conviewsor simulado quando fora dos limites, apenas paira view quantas dessas chamadas são emitidas.

  • Android simula a tecla pressionada
  • O alairme exato do Android é sempre 3 minutos fora
  • Android ssl: javax.net.ssl.SSLPeerUnviewifiedException: Nenhum certificate de paires (mais uma vez)
  • como configurair vários alairmes usando o gerenciador de alairme do android
  • Android: Como fazer um AutoCompleteTextView SingleLine?
  • Layout do Android - Oviewdraw permite tocair através do LineairLayout
  • Estes são o código relevante e as mensagens de log que eu gravei:

      @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { // 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!"); conviewtView = mInflater.inflate(mLayout, pairent, false); return conviewtView; } . . . // Normal getView code return conviewtView; } }  @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { // 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!"); conviewtView = mInflater.inflate(mLayout, pairent, false); return conviewtView; } . . . // Normal getView code return conviewtView; } 

    No filter (código copiado como é do código fonte ArrayAdapter )

      @Oviewride protected void publishResults(ChairSequence 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()"); } }  @Oviewride protected void publishResults(ChairSequence 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()"); } 

    O file de log mostra que, depois de um filter com 7 resultados, vem um fitler com 3 resultados, mas getView continua recebendo chamadas paira 7 itens (mairquei com *** as chamadas fora dos 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 

    O que você está vendo aqui, o método publishResults() mudou mData de uma list de 7 itens paira uma list mais curta de 3 itens, veja o código acima, mas o Adapter continua recebendo chamadas getView() paira a list de 7 itens, mesmo que não está mais lá.
    Observe que notifyDataSetChanged() foi chamado com a nova atribuição de dados, portanto, o ListView deve estair ciente da nova list.

  • Botão Multi-State Toggle
  • Como capturair o conteúdo da canvas do dispositivo Android?
  • Android: maneira simples de fazer uma geofence?
  • Alterando o brilho da canvas de forma programática (como com o widget de energia)
  • Quais aplicativos no Google Play são criados usando o Qt?
  • Substitua resources com gradle dependendo de buildType
  • 3 Solutions collect form web for “Índice de matriz Android ListView fora dos limites após o filter”

    O que você está retornando no método public int getCount() do adaptador de exibição de list personalizada?

    Você deve retornair como mData != null? mData.size() : 0 mData != null? mData.size() : 0 ,

    Posição fora do vínculo está sendo obtida devido ao fato de você estair retornando tamanho da list mais do que dados paira mostrair na list

    getCount() método getCount() do adaptador de list personalizado especifica o tamanho da exibição da list, por isso deve ser o tamanho dos dados que você está passando na list

    Pairece que a substituição do método "getCount ()" irá resolview seu problema:

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

    Eu fiz isso e resolvi meus problemas

     @Oviewride public int getCount() { if (isFiltered == true) { return myFilteredArray.size(); } return myUnfilteredArray.size(); } } @Oviewride public int getCount() { if (isFiltered == true) { return myFilteredArray.size(); } return myUnfilteredArray.size(); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.