2017-02-15 32 views
0

ich eine Funktion als Beschreibung zu implementieren versucht: Jeder Einzelteil in RecyclerView wird nach 5 Sekunden entfernt werden. Mein Code wie folgt:Entfernen Artikel in RecyclerView

new CountDownTimer(60000, 1000) { 
    @Override public void onTick(long l) { 
     Log.v(TAG, "Ticking: " + l); 
     for (int i = 0, dataLength = mComments.size(); i < dataLength; i++{ 
      RoomMessage item = mComments.get(i); 
      // item.timeRemaining initial value is 5000 
      item.timeRemaining -= 1000; 
      if (item.timeRemaining <= 0) { 
       mComments.remove(i); 
       notifyItemRemoved(i); 
      } 
     } 
    } 
    @Override public void onFinish() { 
     start(); 
    } 
}.start(); 

Die App stürzt mit Fehlermeldung sagt wie java.lang.IndexOutOfBoundsException: Index: 4, Size: 4 Was war falsch?

+0

können Sie vollständige Protokoll zur Verfügung stellen? –

+1

Wenn Ihre Größe 4 ist, ist Ihr Indexbereich [0, .. 3]. Sie können nicht entfernen, was nicht an die Liste angehängt ist. – adnbsr

+0

@adnbsr Ja und ich bin ziemlich sicher, dass der Bereich in [0..3] ist –

Antwort

3

Das Problem ist in der for-Schleife.

for (int i = 0, dataLength = mComments.size(); i < dataLength; i++) 

dataLength wird nur einmal (wie bei der i) initialisiert wird, und dann wird dieser Wert für die nächsten Iterationen verwendet werden. Also, wenn die Listengröße anfänglich 4 ist, dann wird dataLength 4 durchgehend sein, wobei die Listengröße weiter abnehmen wird, was IndexOutOfBoundsException verursachen wird.

Ändern der for-Anweisung wie folgt:

for (int i = 0; i < mComments.size(); i++) 
0

das Problem ist mComments.remove(i); mit for wenn Sie ein Element durate ein interation den for Absturz entfernen. Sie müssen die for von enter code here, wie diese ersetzen:

 

    Iterator iterator = mComments.iterator(); 
    while (iterator.hasNext()) { 
     RoomMessage item = iterator.next(); 
     mComments.remove(item); 
     mAdapter.notifyDataSetChanged(); 
    } 
Verwandte Themen