java - 使用 subList 的 ConcurrentModificationException?

标签 java android android-activity android-recyclerview

我有一个常规的 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/

相关文章:

java - 这里的继承是怎么回事?

java - android getRelativeTimeSpanString 月份始终是一月

java - Android 文档列表 查看 XML 格式的示例源代码

android - 如何为 Android 构建 ffmpeg 可执行二进制文件?

java - Spring Boot Security - 默认映射的匿名用户访问/

Android Studio 4.1调试断点不起作用

android - onPause() 在 BaseActivity 的 onResume() 之前调用

android - 执行 Activity 而不在屏幕上显示布局

android - 从深层链接检测打开的应用程序

java - 字节码特性在 Java 语言中不可用