2016-06-20 12 views
0

Ich versuche, Elemente zur Liste hinzuzufügen, aber es gibt einen Fehler, ich kann nicht herausfinden, wie Sie es lösen.
Hier ist ein Beispiel für das Hinzufügen:Versuchen Sie Elemente zu recyclerview (ConcurrentModificationException) hinzuzufügen

for (Object object : mData) { 
    if (object instanceof BaseAdapter.ChoseFriendItem) { 
       mAdapter.addItem(1, object); 
    } 
} 

wo die mDate - Arraylist
Nach der Ausführung des Codes ich die folgende Fehlermeldung erhalten:

FATAL EXCEPTION: main 
Process: com.akbars.bankok, PID: 15263 java.util.ConcurrentModificationException 
at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573) 
at com.akbars.bankok.v2.ActivityChoseFriends.onClick(ActivityChoseFriends.java:311) 
at android.view.View.performClick(View.java:5198) 
at android.view.View$PerformClick.run(View.java:21147) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Dann einen Iterator zu verwenden, habe ich versucht. Aber warum ist es fügt nur ein Element und nicht vom Anfang der Liste, hier ein Beispiel:

for (ListIterator<Object> iterator = mData.listIterator(); iterator.hasNext();) { 
    if (iterator.next() instanceof BaseAdapter.ChoseFriendItem){ 
     mAdapter.addItem(1, iterator.next()); 
     return; 
    } 
} 

Vielleicht jemand weiß, wie man diese Fehler zu beheben?

+0

Warum Artikel, die Sie fügen sich immer auf die zweite Position (1)? – XxGoliathusxX

Antwort

2

Dieser Code Code sollte wie folgt sein:

for (ListIterator<Object> iterator = mData.listIterator(); iterator 
           .hasNext();) { 
          Object item = iterator.next(); 
          if (item instanceof BaseAdapter.ChoseFriendItem){ 
           mAdapter.addItem(1, item); 
           //return; There should be no return statement here. 
          } 
         } 

You called iterator.next() two times which will one element each time and give incorrect results.

+0

es funktioniert nicht für meinen Fall, der Fehler erscheint in dieser Zeile: Objekt item = iterator.next(); – metalink

0

Ich kann davon ausgehen, es ist, weil Sie Elemente hinzufügen, nur auf den ersten Index der Elemente in dem Adapter.

Erhöhen Sie das erste Argument jedes Mal um 1, wenn Sie dem Adapter ein neues Element hinzufügen möchten.

0

Ich verstehe nicht, was Sie tun hier:

for (ListIterator<Object> iterator = mData.listIterator(); iterator.hasNext();) { 
    if (iterator.next() instanceof BaseAdapter.ChoseFriendItem){ 
     mAdapter.addItem(1, iterator.next()); 
     return; 
    } 
} 

Sie in die zweite Position jedes nächste Element hinzufügen. Warum?

Lösung fügt einer nach dem anderen, beginnend mit Position 0 („informa count“):

while(iterator.hasNext())mAdapter.addItem(iterator.next()); 

Wenn dies nicht funktioniert und ich konnte mir nicht vorstellen, warum es nicht diese versuchen sollten:

Handler handler = new Handler(); 
       final Runnable r = new Runnable() { 
        public void run() { 
         mAdapter.addItem(iterator.next()) 
        } 
       }; 

    handler.post(r); 
0

ich hatte dasselbe Problem und ich mein Fall nahm ich Server-Antwortliste:

localList = serverResponseList; 

und als ich versuchte, Hinzufügen neuer Elemente (localList.addAll (ListWithNewElements)) erhalten denselben Fehler.

Um diesen Fehler zu vermeiden, erstellen Sie einfach brauchen neue Liste und dann auf neu erstellte Liste Ihrer Elemente hinzufügen:

public ListAdapter(List<> itemCollections) { 
    this.layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    this.itemCollection = new ArrayList<>(); 
    this.itemCollection.addAll(itemCollection); 
} 


public void addBarsCollection(List<Bar> itemCollection) { 
    this.itemCollection.addAll(itemCollection); 
    this.notifyDataSetChanged(); 
} 
Verwandte Themen