2012-11-23 11 views
12

mam kod folloing w moim android app:java.util.ConcurrentModificationException android po usunąć elementy z listy tablicy

/** 
* callback executed after fetching the data. 
*/ 
public void OnPointsFetch(ArrayList<Shop> result) { 

    toggleLoader(false); 

    this.shops = result; 

    if(activeFilter == Constants.POINTS_FILTER_AVAILABLE){ 
     for(Shop s : result){ 
      if(s.getClientPoints().getPointsAvailable() == 0){ 
       this.shops.remove(s); 
      } 
     } 
    } 
    else{ 
     for(Shop s : result){ 
      if(s.getClientPoints().getPointsSpent() == 0){ 
       this.shops.remove(s); 
      } 
     } 
    } 


    ptsListAdapter.setCollection(this.shops); 
    ptsListAdapter.setFilter(this.activeFilter); 

} 

Ta metoda jest wywoływana w wyniku zadania asynchronicznym. Muszę usunąć niektóre elementy z kolekcji przed przejściem do adaptera listy.

11-23 17:39:59.760: E/AndroidRuntime(19777): java.util.ConcurrentModificationException 
11-23 17:39:59.760: E/AndroidRuntime(19777): at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569) 

Odpowiedz

34

Nie można usuwać elementów z listy podczas iterowania nad nią. Trzeba użyć iterację i sposobu jej usunięcia:

for(Iterator<Shop> it = result.iterator(); it.hasNext();) { 
    Shop s = it.next(); 
    if(s.getClientPoints().getPointsSpent() == 0) { 
     it.remove(); 
    } 
} 
+0

Świetnie. to działa!. – brpaz

0

masz ten błąd zazwyczaj gdy

  1. zmodyfikować kolekcję bezpośrednio podczas jego iteracji po kolekcji

    lub nawet gorzej, gdy jeden wątek modyfikuje kolekcję, a drugi iteruje nad nią.

+1

Dostałby ten wyjątek również z jednym wątkiem (w rzeczywistości prawdopodobnie uruchamia tylko jeden wątek). – assylias

+0

Tak, poprawne, iteracyjne i modyfikujące również to powoduje. – AlexWien

0

Nie jestem pewien, czy zaakceptowana odpowiedź zadziała, ponieważ wewnętrznie spróbuje ponownie zmodyfikować tę samą listę. Czystsze podejście polegałoby na utrzymywaniu listy "usuwania" i dodawaniu elementów do tej listy w pętli. Gdy będziemy gotowi z listą usunięć, mogą one zostać usunięte po pętli. Powinno to działać we wszystkich przypadkach, w których nie musimy ponownie przetwarzać usuniętego elementu. Jeśli tak, istniejąca lista usunięć może zostać sprawdzona pod kątem obecności tego elementu.

List<String> list = new ArrayList<String>(); 
    List<String> listRemove = new ArrayList<String>(); 

    list.add("1"); 
    list.add("2"); 
    list.add("3"); 
    list.add("4"); 
    list.add("5"); 
    list.add("6"); 
    list.add("7"); 
    list.add("8"); 

    System.out.println("list : " + list); 

    for (String i : list) { 
     if (i.equals("2")) { 
      listRemove.add(i); 
     } 
    } 
    list.removeAll(listRemove); 
    System.out.println("updated list: " + list); 
Powiązane problemy