2015-03-12 18 views
7

Ich bekomme diese IndexOutOfBoundsException, aber kann nicht herausfinden, was es verursacht. Meine Listenansicht hat einen Adapter mit einer Liste von Objekten, und die Objekte werden basierend auf einem Zeitstempel entfernt. Das Entfernen erfolgt innerhalb der getView-Methode. Sobald ein Element entfernt wurde, rufe ich notifyDataSetChanged() auf.IndexOutOfBoundsException in meinem Android Listview Adapter

Der vollständige Quellcode ist auf Github verfügbar, und hier ist ein Link zur Listenadaptercode: https://github.com/kenneho/run-for-the-bus/blob/master/app/src/main/java/net/kenneho/runnow/adapters/TravelsAdapter.java

Dies ist der Beginn des Stacktrace Ich erhalte:

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> 

ich, dass oft sehen Der Positionswert in getView kann bis zu sechs oder sieben betragen.

Kann hier jemand den Fehler erkennen? Jede Hilfe wird geschätzt.

Grüße, Kenneth

EDIT 1: * Link zu den Aktivitätscode, der die Verwendungen: https://github.com/kenneho/run-for-the-bus/blob/master/app/src/main/java/net/kenneho/runnow/InfoActivity.java * I die wichtigsten logcat Teil hier eingefügt haben: http://pastebin.com/5FtU4EaM

+0

Sie versuchen, auf die ArrayList zuzugreifen, wenn sie leer ist. Veröffentlichen Sie einen Code. – VERT9x

+0

Können Sie Ihren Aktivitätscode posten? Größe ist 0 bedeutet Ihre Liste ist leer. –

+0

* Die Entfernung erfolgt innerhalb der getView-Methode. * Und hier ist das Problem auch remove-Methode vom Adapter ruft bereits notifyDataSetChanged ... – Selvin

Antwort

1

Schließlich wird der Fehler behoben ist . Zuerst habe ich den Code wie von @Selvin vorgeschlagen umstrukturiert. Zweitens Ich habe eine „removeCallback“ -Anweisung keine Runnables zu stoppen, bevor neue zu schaffen:

// 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); 

Dank für die Hilfe bei diesen Fehler aufzuspüren.

+0

hast du dieses getView() ?? –

Verwandte Themen