我的代码没有像我想象的那样工作。列表listColumn0
包含屏幕上8个精灵对象的X和Y位置。当我触摸其中一个时,我检查与该X和Y位置匹配的女巫精灵对象,然后将其从列表中删除。但奇怪的是,只有当我第一次触摸索引为7的最后一个精灵对象,然后继续使用索引为6的精灵对象时,这才有效。
如果我点击,让我们说,精灵对象的索引为3或其他一些除了最后一个,那么应用程序正在关闭!为什么这个?有人可以看到我做错了什么或者我能以更好的方式做到这一点吗?有没有更好的方法来检测/匹配我触摸过的精灵对象?
String size = Integer.toString(listColumn0.size());
// Check all lists
for(ColorObject colorObject: listColumn0) {
if(x > (colorObject.xPosition - colorObject.radius) && x < (colorObject.xPosition + colorObject.radius) && y > (colorObject.yPosition - colorObject.radius) && y < (colorObject.yPosition + colorObject.radius)) {
String colorCode = Integer.toString(colorObject.color);
String index = Integer.toString(listColumn0.indexOf(colorObject));
Log.i("Test","Match!! " + size + " Color: " + colorCode + "ID: " + index);
listColumn0.remove(listColumn0.indexOf(colorObject));
}
}
修改
来自LogCat的错误消息:
05-22 07:08:55.482: W/dalvikvm(1444): threadid=12: thread exiting with uncaught exception (group=0x40a13300)
05-22 07:08:55.482: E/AndroidRuntime(1444): FATAL EXCEPTION: Thread-124
05-22 07:08:55.482: E/AndroidRuntime(1444): java.util.ConcurrentModificationException
05-22 07:08:55.482: E/AndroidRuntime(1444): at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569)
05-22 07:08:55.482: E/AndroidRuntime(1444): at com.test.game.ColorObjectManager.checkPosition(ColorObjectManager.java:164)
05-22 07:08:55.482: E/AndroidRuntime(1444): at com.test.game.GameLoop.run(GameLoop.java:190)
05-22 07:08:55.482: E/AndroidRuntime(1444): at java.lang.Thread.run(Thread.java:856)
05-22 07:13:55.753: I/Process(1444): Sending signal. PID: 1444 SIG: 9
答案 0 :(得分:1)
使用foreach循环迭代时,不能修改listColumn0
。这样做会产生ConcurrentModificationException
,您可以在LogCat中看到它。
如果使用过时的Iterator
,您可以在迭代时修改集合:
Iterator<ColorObject> it = listColumn0.iterator();
while(it.hasNext()) {
ColorObject colorObject = it.next();
...
it.remove(); // this removes the current object
}
为了缩小it
的范围,最好在这里使用for循环:
for (Iterator<ColorObject> it = listColumn0.iterator(); it.hasNext();) {
ColorObject colorObject = it.next();
...
it.remove(); // this removes the current object
}
答案 1 :(得分:0)
最简单的解决方案是
Integer colorObjectIndex = -1;
for(..)
.....
colorObjectIndex = listColumn0.indexOf(colorObject)
.....
}
// check for colorObjectIndex > -1
listColumn0.indexOf(colorObjectIndex);
否则你必须使用listColumn0的Iterator。