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