尝试向recyclerview添加元素(ConcurrentModificationException)

时间:2016-06-20 19:27:34

标签: java android android-recyclerview adapter add

我试图将项目添加到列表中,但是有一个错误,我无法弄清楚如何解决它。
以下是添加的示例:

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

其中mDate - arraylist
执行代码后,我收到以下错误:

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)

然后我尝试使用迭代器。但是为什么它只添加一个元素而不是从列表的开头添加,这是一个例子:

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

也许有人知道如何解决这个错误?

4 个答案:

答案 0 :(得分:2)

这段代码你的代码应该是这样的:

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.
                            }
                        }
  

您调用了iterator.next()两次,每次都会调用一个元素并给出不正确的结果。

答案 1 :(得分:1)

我有同样的问题,我的情况我拿了服务器响应列表:

localList = serverResponseList;

当我尝试添加新元素(localList.addAll(ListWithNewElements))时会收到相同的错误。

要避免此错误,您只需创建新列表,然后将新元素添加到新创建的列表中:

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();
}

答案 2 :(得分:0)

我可以假设这是因为您只将元素添加到适配器中项目的第一个索引。

{{1}}

每次要向适配器添加新项目时,将第一个参数增加1。

答案 3 :(得分:0)

我不明白你在这做什么:

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

您将每个下一个项目添加到第二个位置。为什么呢?

解决方案从位置0开始一个接一个地添加(&#34;信息计数&#34;):

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

如果这不起作用,我无法想象它为什么不应该尝试这个:

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

  handler.post(r);