我有一个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用于选择的路径。
答案 0 :(得分:1)
你正在迭代ArrayList
(RouteListLV.arrayOfRoutesEnabled
)并在你继续修改它。这导致ConcurrentModificationException
,所以不要这样做。找到一种方法来首先找到您要修改的元素,然后修改列表(之后不要使用迭代器)。或者构建列表的“影子”副本,其中包含您希望它在最后拥有的所有内容,然后在原始列表中调用removeAll()
然后调用addAll(newList)
,这只是略有相同的想法不同的形式。