首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用subList的ConcurrentModificationException?

使用subList的ConcurrentModificationException?
EN

Stack Overflow用户
提问于 2017-06-10 01:29:53
回答 1查看 609关注 0票数 1

我有一个普通的RecyclerView。

我的RecyclerView有一个监听器接口,Activity在该接口上监听。当单击RecyclerView中的项时,将调用"onItemClick()“事件。

当调用此事件时,我需要从RecyclerView中删除接下来的5个项,并将它们添加到一个Map (Map<Integer, List<Object>>)中。如果再次单击RecyclerView中的相同项目,我希望将这5个项目重新添加到RecyclerView中。

下面是我的代码在我的活动中的样子(注意,我删除了所有不相关的代码,比如onCreate()方法等):

代码语言:javascript
复制
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)行上得到了这个错误

代码语言:javascript
复制
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)

为什么我会得到这个错误?我该如何修复它?

EN

回答 1

Stack Overflow用户

发布于 2017-06-10 01:43:37

在你的data.addAll(position,fiveItems)方法中,内部使用迭代器a= c.toArray(),它使用迭代器it =;.When(),你将使用迭代器,同时,如果其他一些人改变了相同的列表,那么modCount也会改变,这会导致exception.So,你需要找出负责它的代码。

来自java api的toArray()源代码

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44463662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档