更新扩展ArrayAdapter的ListView时出现ConcurrentModificationException

时间:2014-08-22 16:13:03

标签: java android listview

我有一个ListView,每个单元都有一个适配器。此适配器扩展了ArrayAdapter(我的对象类)。 该应用程序目前还有2个选项卡。选项卡1具有列表,选项卡2具有地图。

适配器中的每个单元格都有一个复选框,默认情况下是未选中的。

我遇到的问题是,当我切换选项卡时,复选框将返回取消选中,如果我迭代一个复选框数组,当我尝试将一个框标记为已选中时,我会收到ConcurrentModificationException。

这是我正在做的事情的代码:

    value_checkBox.setTag(route.getRouteShortName());

    value_checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
    {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
        {
            if (isChecked == true)
            {
                RouteListLV.arrayOfRoutesEnabled.add(route);
            }
            else
            {
                RouteListLV.arrayOfRoutesEnabled.remove(route);
            }
        }
    });

这部分(上面的示例代码)有效,这里我将检查的路由添加到可供多个视图使用的静态数组中。

    for (Route routeFromArray : RouteListLV.arrayOfRoutesEnabled)
    {
        if (routeFromArray.getRouteShortName().equals(route.getRouteShortName() ) )
        {
            System.out.println("Match!");
            value_checkBox.setChecked(true);    <--- causes the ConcurrentModificationException
        }
    }

这个循环(上面的for循环)不起作用,当我设置要检查的checkBox时发生异常。 我也尝试过迭代器,但是得到了相同的结果:

    Iterator<Route> iterator = RouteListLV.arrayOfRoutesEnabled.iterator();
    while (iterator.hasNext())
    {
        Route routeFromArray = iterator.next();

        if (routeFromArray.getRouteShortName().equals(route.getRouteShortName() ) )
        {
            System.out.println("Match!");
            value_checkBox.setChecked(true);    <--- causes the ConcurrentModificationException
        }
    }

有关此问题的任何建议吗? 为了清楚起见,我有2个数组列表。一个是带有整个“routes”列表的那个,它被传递给ArrayAdapter以形成列表,而我只有第二个arrayList用于选择的路径。

1 个答案:

答案 0 :(得分:1)

你正在迭代ArrayListRouteListLV.arrayOfRoutesEnabled)并在你继续修改它。这导致ConcurrentModificationException,所以不要这样做。找到一种方法来首先找到您要修改的元素,然后修改列表(之后不要使用迭代器)。或者构建列表的“影子”副本,其中包含您希望它在最后拥有的所有内容,然后在原始列表中调用removeAll()然后调用addAll(newList),这只是略有相同的想法不同的形式。