Если список 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
.Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Как сделать так чтобы изображения разного размера в галереи отображались с одинаковой высотой и ширинойТо есть чтобы они автоматически...
Добрый день! как можно убрать белые полосы с картинок тут ссылка на страничку галереи
Добрый день всемПрошу помощи в довольно таки простом задании, но самостоятельно найти ответ не получается