【问题标题】:Try to add elements to recyclerview (ConcurrentModificationException)尝试将元素添加到 recyclerview (ConcurrentModificationException)
【发布时间】:2016-06-20 19:27:33
【问题描述】:

我正在尝试将项目添加到列表中,但出现错误,我不知道如何解决它。
下面是一个添加的例子:

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

mDate 所在位置 - 数组列表
执行代码后出现以下错误:

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

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

【问题讨论】:

  • 为什么总是将项目添加到第二 (1) 个位置?

标签: java android android-recyclerview adapter add


【解决方案1】:

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

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() 两次,每次都会调用一个元素并给出错误的结果。

【讨论】:

  • 它不适用于我的情况,错误出现在这一行: Object item = iterator.next();
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    mAdapter.addItem(1, item);
    

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

    【讨论】:

      【解决方案4】:

      我不明白你在这里做什么:

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

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

      解决方案从位置 0 开始依次添加(“信息计数”):

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

      【讨论】:

        猜你喜欢
        • 2012-01-01
        • 1970-01-01
        • 2021-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多