Если список reddots:
ArrayList<Red> reddots = new ArrayList();
В него добавляются элементы:
class DotListener extends InputListener {
@Override
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button){
event.getListenerActor().remove();
float xx = event.getListenerActor().getX();
float yy = event.getListenerActor().getY();
int ind = ((int)xx - 46) / 69;
if (count % 2 == 0) {
Red r = new Red();
r.setSize(30, 30);
r.setPosition(xx, yy);
r.setColor(Color.RED);
reddots.add(ind, r);
stage.addActor(r);
} else {
Blue b = new Blue();
b.setSize(30, 30);
b.setPosition(xx, yy);
b.setColor(Color.BLUE);
stage.addActor(b);
}
count++;
return true;
}
}
Почему код крашится? Если убрать reddots.add(ind, r), то крашиться не будет. Но мне нужно давать индекс каждой точке.
Классы Red и Blue наследуются от Dot.
Класс Dot:
class Dot extends Actor { //invisible
@Override
public void draw(Batch batch, float parentAlpha) {
Color batchColor = batch.getColor();
final float r = batchColor.r;
final float g = batchColor.g;
final float b = batchColor.b;
final float a = batchColor.a;
Color dotColor = getColor();
batch.setColor(dotColor.r, dotColor.g, dotColor.b, dotColor.a * parentAlpha);
batch.draw(dotimg, getX(), getY(), getWidth(), getHeight());
batch.setColor(r, g, b, a);
}
}
Ошибка в консоли:
E/AndroidRuntime: FATAL EXCEPTION: GLThread 151 Process: com.mygdx.game, PID: 2941 java.lang.IndexOutOfBoundsException: Index: 9, Size: 0 at java.util.ArrayList.add(ArrayList.java:457) at com.mygdx.game.MyGdxGame$DotListener.touchDown(MyGdxGame.java:48) at com.badlogic.gdx.scenes.scene2d.InputListener.handle(InputListener.java:56) at com.badlogic.gdx.scenes.scene2d.Actor.notify(Actor.java:182) at com.badlogic.gdx.scenes.scene2d.Actor.fire(Actor.java:147) at com.badlogic.gdx.scenes.scene2d.Stage.touchDown(Stage.java:282) at com.badlogic.gdx.backends.android.AndroidInput.processEvents(AndroidInput.java:375) at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:457) at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1548) at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1259) E/AndroidGraphics: waiting for pause synchronization took too long; assuming deadlock and killing
Вы создаёте пустой список:
ArrayList<Red> reddots = new ArrayList();
Размер (size) по умолчанию у него 0.
Когда вы пытаетесь добавить элемент в список на определённую позицию, происходит такая проверка:
if (index > size || index < 0)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
Так как index в вашем случае равен 9 (судя по stacktrace), а размер - 0, то в итоге пробрасывается исключение.
Вариантов решения проблемы в данной ситуации как минимум два:
Добавлять элементы не на конкретный индекс, а в конец списка:
reddots.add(r);
Если всё же нужно добавлять на определённый индекс, то стоит позаботиться о размере списка при его создании:
int dotsCount = 1000;
Red[] dummy = new Red[dotsCount];
ArrayList<Red> reddots = new ArrayList<>(Arrays.asList(dummy));
На всякий случай уточню зачем городить такой код:
ArrayList, задав ему initialCapacity, то size его по-прежнему будет 0 и IndexOutOfBoundsException снова появится.List<Red> reddots = Arrays.asList(dummy);, то при попытке добавить элемент в список будет проброшено UnsupportedOperationException.Сборка персонального компьютера от Artline: умный выбор для современных пользователей