2015-03-12 8 views
7

Continuo a ricevere questo IndexOutOfBoundsException, ma non riesco a capire cosa lo sta causando. Il mio listview ha un adattatore con un elenco di oggetti e gli oggetti vengono rimossi in base a un timestamp. La rimozione viene eseguita all'interno del metodo getView. Una volta rimosso un elemento, chiamo notifyDataSetChanged().IndexOutOfBoundsException nel mio adattatore Listview Android

Il codice sorgente completo è disponibile su GitHub, ed ecco un link al codice dell'adattatore listview: https://github.com/kenneho/run-for-the-bus/blob/master/app/src/main/java/net/kenneho/runnow/adapters/TravelsAdapter.java

Questo è l'inizio del stacktrace Continuo a ricevere:

java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
at java.util.ArrayList.get(ArrayList.java:308) 
at android.widget.HeaderViewListAdapter.isEnabled(HeaderViewListAdapter.java:164) 
at android.widget.ListView.dispatchDraw(ListView.java:3307) 
at android.view.View.draw(View.java:15213) 
<snip> 

vedo che spesso il valore di posizione all'interno di getView può arrivare fino a sei o sette.

Qualcuno può individuare l'errore? Qualsiasi aiuto sarà apprezzato.

saluti, Kenneth

EDIT 1: * Link il codice attività che utilizza il: https://github.com/kenneho/run-for-the-bus/blob/master/app/src/main/java/net/kenneho/runnow/InfoActivity.java * Ho incollato la parte più rilevante logcat qui: http://pastebin.com/5FtU4EaM

+0

Si sta tentando di accedere a ArrayList quando è vuoto. Pubblica un po 'di codice. – VERT9x

+0

Puoi pubblicare il tuo codice attività? la dimensione è 0 significa che la tua lista è vuota. –

+0

* La rimozione viene eseguita all'interno del metodo getView. * E qui è il problema anche rimuovere il metodo dall'adattatore sta già chiamando notifyDataSetChanged ... – Selvin

risposta

1

Infine, il bug è stato risolto . Innanzitutto, ho rifattorizzato il codice come suggerito da @Selvin. In secondo luogo, ho aggiunto un -affermazione "removecallback" per fermare eventuali Runnables prima di crearne di nuovi:

// Make sure we stop existing timers, if any. 
timerHandler.removeCallbacks(timerRunnable); 

timerRunnable = new Runnable() { 

    @Override 
    public void run() { 
     removeExpiredTravels(myAdapter); 
     myAdapter.notifyDataSetChanged(); 
     timerHandler.postDelayed(this, 1000); 
    } 
}; 

timerHandler.postDelayed(timerRunnable, 0); 

Grazie per avermi aiutato rintracciare questo bug.

+0

hai scritto questo getView() ?? –