我有一个常规的 RecyclerView。
我的 RecyclerView 有一个 Activity 监听的监听器接口(interface)。单击 RecyclerView 中的项目时,将调用“onItemClick()”事件。
调用此事件时,我需要从 RecyclerView 中删除接下来的 5 个项目,并将它们添加到 Map
中(Map<Integer, List<Object>>
)。如果再次单击 RecyclerView 中的相同项目,我希望将这 5 个项目重新添加到 RecyclerView。
这是我的代码在 Activity 中的样子(注意我删除了所有不相关的代码,例如 onCreate()
方法等):
public class MainActivity extends AppCompatActivity implements MyAdapter.MyAdapterListener {
// The RecyclerView data
private List<Object> data = new ArrayList<>();
// The Map to keep track of all removed data
private Map<Integer, List<Object>> removedData = new HashMap<>();
private RecyclerView recyclerView;
private LinearLayoutManager linearLayoutManager;
private MyAdapter myAdapter;
@Override
public void onItemClick(int position) {
Item item = (Item) data.get(position);
// Check if the Map key/value pair already exists
if (removedData.get(item.getId()) != null) {
// Key/value pair exists, re-add the 5 items into the
// RecyclerView and remove the key/value pair from the Map
List<Object> fiveItems = removedData.get(item.getId());
// Re-add the five items to the RecyclerView
data.addAll(position, fiveItems);
// Remove the key/value pair from the Map
removedData.remove(item.getId());
} else {
// Key/value pair doesn't exist, remove the next 5 items
// from the RecyclerView and add it to the Map
int start = position + 1;
int end = position + 5;
List<Object> fiveItems = data.subList(start, end);
// Add the five items to the Map
removedData.put(item.getId(), fiveItems);
// Remove the items from the RecyclerView
data.subList(start, end).clear();
}
// Notify data set changed
myAdapter.notifyDataSetChanged();
}
}
但是,我在 data.addAll(position, fiveItems)
行收到此错误:
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)
为什么会出现此错误?我该如何解决?
最佳答案
在你的 data.addAll(position, fiveItems) 方法内部使用 Object[] a = c.toArray() ,它使用 Iterator 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;
关于java - 使用 subList 的 ConcurrentModificationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44463662/