Java ConcurrentModificationException是否使用子列表?
我有一个定期的回收站 我的RecyclerView有一个侦听器接口,活动在该接口上侦听。单击RecyclerView中的项目时,将调用“onItemClick()”事件 调用此事件时,我需要从RecyclerView中删除接下来的5项,并将它们添加到Java ConcurrentModificationException是否使用子列表?,java,android,android-activity,android-recyclerview,Java,Android,Android Activity,Android Recyclerview,我有一个定期的回收站 我的RecyclerView有一个侦听器接口,活动在该接口上侦听。单击RecyclerView中的项目时,将调用“onItemClick()”事件 调用此事件时,我需要从RecyclerView中删除接下来的5项,并将它们添加到Map(Map)。如果再次单击RecyclerView中的同一项,我希望将这5项重新添加到RecyclerView中 下面是我的代码在活动中的样子(注意,我删除了所有不相关的代码,如onCreate()方法等): 为什么我会犯这个错误?如何修复它?在
Map
(Map
)。如果再次单击RecyclerView中的同一项,我希望将这5项重新添加到RecyclerView中
下面是我的代码在活动中的样子(注意,我删除了所有不相关的代码,如onCreate()
方法等):
为什么我会犯这个错误?如何修复它?在您的数据中。addAll(position,fiveItems)方法在内部使用Object[]a=c。toArray()方法使用迭代器it=Iterator();。当您使用迭代器时,如果其他人更改了相同的列表,那么modCount将更改,从而导致异常。因此,您需要找出导致异常的代码
来自java api的toArray()源代码
Object[] r = new Object[size()];
Iterator<E> it = iterator();
for (int i = 0; i < r.length; i++) {
if (! it.hasNext()) // fewer elements than expected
return Arrays.copyOf(r, i);
r[i] = it.next();
}
return it.hasNext() ? finishToArray(r, it) : r;
Object[]r=新对象[size()];
迭代器it=迭代器();
对于(int i=0;i
您是否阅读了子列表文档?如果支持列表(即,此列表)以任何方式(而不是通过返回的列表)进行结构修改,则此方法返回的列表的语义将变得未定义。(结构修改是指更改此列表的大小,或以其他方式干扰此列表,使正在进行的迭代可能产生不正确的结果。)换句话说,如果您使用子列表,则不应修改它(数据列表)。为了从列表中获取下一个5项,除了子列表,我还可以使用什么?
06-FATAL EXCEPTION: main
java.util.ConcurrentModificationException
at java.util.ArrayList$SubList.size(ArrayList.java:1028)
at java.util.AbstractCollection.toArray(AbstractCollection.java:136)
at java.util.ArrayList.addAll(ArrayList.java:589)
at com.my.package.activity.MainActivity.onItemClicked(MainActivity.java:238)
at com.my.package.adapter.MyAdapter$ViewHolderItem.onClick(MyAdapter.java:235)
at android.view.View.performClick(View.java:5637)
at android.view.View$PerformClick.run(View.java:22429)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Object[] r = new Object[size()];
Iterator<E> it = iterator();
for (int i = 0; i < r.length; i++) {
if (! it.hasNext()) // fewer elements than expected
return Arrays.copyOf(r, i);
r[i] = it.next();
}
return it.hasNext() ? finishToArray(r, it) : r;