Android RecyclerView中的并发修改
我在从Android RecyclerView中的并发修改,android,android-recyclerview,Android,Android Recyclerview,我在从RecyclerView中的列表中删除项目时遇到问题。它包含已检查项目的列表。我想取消选中列表中的一项 因此,方法removeGroupItem()从选中项列表中删除项。这是: private void removeGroupItem(String groupId) { for (String group : pickedGroups) { if (group.equals(groupId)) pickedGroups.remove(grou
RecyclerView
中的列表中删除项目时遇到问题。它包含已检查项目的列表。我想取消选中列表中的一项
因此,方法removeGroupItem()
从选中项列表中删除项。这是:
private void removeGroupItem(String groupId) {
for (String group : pickedGroups) {
if (group.equals(groupId))
pickedGroups.remove(group);
}
}
如果我在某个项目上快速点击2-3次,它就会崩溃。
这里是stacktrace:
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.next(ArrayList.java:860)
at com.camness.vidimguploadjun2016.trips.group_adapter.GroupsAdapter.removeGroupItem(GroupsAdapter.java:76)
at com.camness.vidimguploadjun2016.trips.group_adapter.GroupsAdapter.access$300(GroupsAdapter.java:16)
at com.camness.vidimguploadjun2016.trips.group_adapter.GroupsAdapter$GroupViewHolder.lambda$new$0$GroupsAdapter$GroupViewHolder(GroupsAdapter.java:65)
at com.camness.vidimguploadjun2016.trips.group_adapter.GroupsAdapter$GroupViewHolder$$Lambda$0.onClick(Unknown Source:2)
at android.view.View.performClick(View.java:6303)
at android.widget.CompoundButton.performClick(CompoundButton.java:134)
at android.view.View$PerformClick.run(View.java:24828)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6798)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
提前感谢大家的帮助。首先改变工作逻辑。例如,您可以在删除后断开
for (String group : pickedGroups) {
if (group.equals(groupId)) {
pickedGroups.remove(group);
break;
}
}
但是,您还必须同步有权访问此阵列的线程。比如说
synchronized(pickedGroups) {
for (String group : pickedGroups) {
if (group.equals(groupId)) {
pickedGroups.remove(group);
break;
}
}
}
是的,您不能像这样在普通集合上进行迭代时将其删除。您需要使用迭代器进行迭代并使用其remove()方法。@MarkusKauppinen谢谢,它解决了我的问题!如果您中断它,for循环将在之后不工作,因为您退出了它。也就是说,只有第一个被移除。