2016-07-28 12 views
0

Dies ist die Methode:Objekt aus einer Liste Remvoing während Iterieren es nicht funktioniert (mit Iterator)

public void deleteEvent(View view){ 
     Intent intent = new Intent(this, MainActivity.class); 

     for (User myUser:LocalDataBase.getEventByID(eventID).getInvitedUsersTotal()){ 
      for (Event myEvent:myUser.getAttendingList()) 
      { 
       ListIterator<Event> itr_attending =myUser.getAttendingList().listIterator(); 
       if (myEvent.getId()==eventID){ 
        itr_attending.remove(); 
       } 

      } 
     } 

     Toast.makeText(getApplicationContext(), "The event was deleted",Toast.LENGTH_LONG).show(); 
     startActivity(intent); 
} 

Diese Methode ist, um ein Ereignis aus der Datenbank zu löschen. Um dies zu tun, muss ich es aus der "Teilnehmerliste" jedes eingeladenen Benutzers entfernen. (Wenn der Benutzer sagt, dass er zu dem Ereignis geht, wird das Ereignis auf diese Liste von ihm verschoben).

Jedes Ereignis hat eine Liste der eingeladenen Benutzer (invitedUsersTotal), und für jeden Benutzer sollte die Methode über die Teilnehmerliste gehen und Suche nach dem gewünschten Ereignis (myEvent.getId()==eventID), und dann löschen Sie es.

Am Ende wird das Ereignis nicht aus der Teilnehmerliste gelöscht.

Was mache ich hier falsch?

+0

Was funktioniert nicht? Passiert nichts? Explodiert Ihr Computer? – Jokab

+0

Das Ereignis wird nicht aus der Teilnehmerliste gelöscht, sorry dafür – Jack

+0

Was denken Sie, dass Sie aus der Liste entfernen, wenn Sie 'itr_attending.remove()' aufrufen? –

Antwort

4

Lesen Sie die Javadoc of ListIterator.remove():

aus der Liste Entfernt das letzte Element, das durch next() oder previous()

Sie nie rufen next() oder previous() auf der Liste Iterator zurückgegeben wurde, so gibt es nichts zu entfernen.


Es ist nicht ganz klar, was Sie aus der Liste zu entfernen beabsichtigen, - aber die Tatsache, dass Sie zwei Iteratoren gleichzeitig auf der gleichen Liste haben lässt vermuten, dass - wenn man wirklich etwas entfernt hat - Sie ConcurrentModificationException bekäme sowieso.

Ich denke, dass Sie für Schleife mit einer expliziten Iteration der inneren verbessert ersetzen müssen: Sie nicht aus einer Liste entfernen, die Sie mit einer erweiterten for-Schleife sind Iterieren:

for (User myUser: ...){ 
    Iterator<Event> it = myUser.getAttendingList().iterator(); 
    while (it.hasNext()) { 
    Event myEvent = it.next(); 
    if (myEvent.getId()==eventID){ 
     it.remove(); 
    } 
    } 
} 
0

wie dies tut

ListIterator<Event> itr_attending =myUser.getAttendingList().listIterator(); 
     int id = myEvent.getId() 
     while(itr_attending.hasNext()){    
      if (id==eventID){ 
       itr_attending.remove(); 
      } 
     } 
0

ich denke, du so iterieren sollte:

ListIterator<Event> itr_attending =myUser.getAttendingList().listIterator(); 
    // Below you are iterating 
    while(itr_attending.hasNext()){ 
     Event event = itr_attending.next(); 
     int eventId = event.getEventId() // Or something like that based on event object 
     if (myEvent.getId()==eventID){ 
      itr_attending.remove(); 
     } 
    } 

Nachdem es immer Erator, Sie brauchen Schleife mit itr_attending.hasNext(). Es prüft, ob Sie ein nächstes Element in der Schleife haben. Und wenn Sie haben, Bedingung erfolgreich und Sie können das Event-Objekt von itr_attending.next() abrufen. Dann mach was du machen willst.