Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更新扩展ArrayAdapter的ListView时的ConcurrentModificationException_Java_Android_Listview - Fatal编程技术网

Java 更新扩展ArrayAdapter的ListView时的ConcurrentModificationException

Java 更新扩展ArrayAdapter的ListView时的ConcurrentModificationException,java,android,listview,Java,Android,Listview,我有一个ListView,每个单元格都有一个适配器。此适配器扩展了ArrayAdapter(我的对象类)。 到目前为止,该应用程序还有两个标签。选项卡1有列表,选项卡2有地图 适配器中的每个单元格都有一个复选框,默认情况下未选中该复选框 我遇到的问题是,当我切换选项卡时,复选框返回为未选中状态,如果我迭代一个复选框数组,当我尝试将一个框标记为选中时,会得到一个ConcurrentModificationException 以下是我所做工作的代码: value_checkBox.setTa

我有一个ListView,每个单元格都有一个适配器。此适配器扩展了ArrayAdapter(我的对象类)。 到目前为止,该应用程序还有两个标签。选项卡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(路由routeFromArray:RouteListLV.ArrayFrouteSenabled)
{
if(routeFromArray.getRouteShortName().equals(route.getRouteShortName()))
{
System.out.println(“匹配!”);

value_checkBox.setChecked(true);您正在迭代一个
ArrayList
RouteListLV.arrayFrouteSenabled
)并在执行过程中对其进行修改。这会导致出现
ConcurrentModificationException
,所以不要这样做。找到一种方法,首先找到要修改的一个或多个元素,然后修改列表(之后永远不要使用迭代器)。或者构建列表的“影子”副本,该副本包含您希望它在末尾包含的所有内容,然后调用
removeAll()
,然后调用
addAll(newList)
在原始列表上,这是相同的想法,但形式略有不同。

但在我从arrayList添加或删除routes时,不会引发异常,如以下所示:RouteListIV.ArrayOfRouteEnabled.add(route);仅当我要修改复选框的值时才会引发异常,其中包含已修改的arrayList的元素。更改复选框的值将调用
RouteListV.arrayOfRoutesEnabled.add(route)
;您认为如何“当我从ArrayList添加或删除路由时,没有引发异常?似乎这正是您正在做的…还有,您为什么说您有一个“已修改的ArrayList”?我没有看到任何这样的代码。你是对的。复制arrayList并在将侦听器设置为复选框之前调用它就成功了。谢谢!
    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
        }
    }