2017-09-28 6 views
2
geworfen auf

i Liste der Tags in forloop für Iterierte vorbei, aber seine angehobene ConcurrentModificationExceptionConcurrentModificationException für jeden in android

public void clearTag() { 
    List<Tag> tags = binding.search.tagView.getTags(); 
    Log.d(TAG, "clearTags: " + tags); 
    for (Tag tag : tags) { 
     Log.d(TAG, "clearTag: " + tag + " " + tag.getLayoutColor()); 
     if (tag.getLayoutColor() == R.color.red) { 
      tags.remove(tag); 
     } else if (tag.getLayoutColor() == R.color.blue) { 
      tags.remove(tag); 
     } else if (tag.getLayoutColor() == R.color.green) { 
      tags.remove(tag); 
     } 
    } 
    updateTagVisibility(); 
    //resetFilter(); 
} 
+0

Sie Dinge aus der Sammlung zu entfernen Sie iterieren. Das ist nicht erlaubt – 0xDEADC0DE

+0

danke für die Antwort. dann, wie man das löst. – sam

Antwort

1

Dies liegt daran, entfernen und hinzufügen Operationen nicht erlaubt werden, während durch ein Array iterieren. Sie müssen also alle zu entfernenden Elemente in einem anderen Array speichern und sie dann sofort entfernen. Hier ein Beispiel:

public void clearTag() { 
    List<Tag> tags = binding.search.tagView.getTags(); 
    List<Tag> tagsToRemove = new ArrayList<>(); 
    Log.d(TAG, "clearTags: " + tags); 
    for (Tag tag : tags) { 
     Log.d(TAG, "clearTag: " + tag + " " + tag.getLayoutColor()); 
     if (tag.getLayoutColor() == R.color.red) { 
      tagsToRemove.add(tag); 
     } else if (tag.getLayoutColor() == R.color.blue) { 
      tagsToRemove.add(tag); 
     } else if (tag.getLayoutColor() == R.color.green) { 
      tagsToRemove.add(tag); 
     } 
    } 
    tags.removeAll(tagsToRemove); 
    updateTagVisibility(); 
    //resetFilter(); 
} 
+0

danke für Ihre wertvolle Hilfe und ihre Arbeit – sam

0

Wenn Sie für jede Schleife zu einem 'normalen' ändern for-Schleife, wie mit (int = 0; i < Größe; i ++), es möglicherweise funktioniert. Stellen Sie sicher, dass Sie jedes Mal, wenn Sie ein Element löschen, ein Element zurückgehen müssen i--;

0

Ich bin vor kurzem auf diese Ausnahme gestoßen. Es tritt auf, wenn Sie versuchen, eine Sammlung zu ändern, die Sie bereits verwenden/wiederholen.

Ihre für jede Schleife wählt ein Tag Objekt aus der tags Liste und innerhalb der Schleife entfernen Sie das Objekt aus der gleichen Liste. Dies ist in Java nicht erlaubt.

Sie können Ihren Code wie folgt ändern:

public void clearTag(){ 
    List<Tag> tags = binding.search.tagView.getTags(); 
    // Create a dummy arrayList to store the tags to remove 
    List<Tag> removedTags = new ArrayList<Tag>(); 
    Log.d(TAG, "clearTags: " + tags); 
    for (Tag tag : tags) { 
     Log.d(TAG, "clearTag: " + tag + " " + tag.getLayoutColor()); 
     if (tag.getLayoutColor() == R.color.red) { 
      removedTags.add(tag); 
     } else if (tag.getLayoutColor() == R.color.blue) { 
      removedTags.add(tag); 
     } else if (tag.getLayoutColor() == R.color.green) { 
      removedTags.add(tag); 
     } 
    } 

    // remove the tags 
    tags.removeAll(removedTags) 
    updateTagVisibility(); 
    //resetFilter(); 
} 

Reference

Verwandte Themen