Страницы

Поиск по вопросам

пятница, 12 июля 2019 г.

Не верная логика программы для GridLayout

Здравствуйте. Помогите разобраться в чем может быть проблема. Написал вот такой код и в нем есть описание действий:
int countPosition = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { GridLayout.Spec buttonRowSpec = GridLayout.spec(i); GridLayout.Spec buttonSpecColumn = GridLayout.spec(j); TouchAction actionListener = new TouchAction(gridLayout, buttons, gameController); ImageButton button = ButtonsFactory.createImageButton(this, bitmaps[i][j], countPosition, paddingImgBtn, actionListener); countPosition++; if (countPosition < 12) buttons.add(button); // добавляем кажду кнопку в коллекцию // добавляем каждую кнопку в GridLayout с указанными параметрами gridLayout.addView(button, new GridLayout.LayoutParams(buttonRowSpec, buttonSpecColumn)); } }
gridLayout.removeAllViewsInLayout(); // удаляем кнопки из GridLayout Collections.shuffle(buttons); // перемешиваем коллекцию с кнопками Bitmap lastImageBitmap = ImageProcessor.resizeImage(getResources(), R.drawable.locked, bitmaps[0][0].getWidth(), bitmaps[0][0].getHeight(), true); lastButton.setImageBitmap(lastImageBitmap); buttons.add(lastButton); // добавляем кнопку с картинкой замочка в самый конец коллекции
for (int i = 0; i < 12; i++) { ImageButton button = buttons.get(i); // получаем кнопки из перемешанной коллекции gridLayout.addView(button); // добавляем их в GridLayout } // делаем валидацию что бы отобразилось корректно, но что то подсказывает мне, что этот метод тут не для этого! // в SWING есть у JPanel такой метод как validate(), решил, что и тут так же, но увы видимо нет gridLayout.invalidate();
Картинка на выходе не та, что ожидалась по логике, кнопки должны были перемешаться:


Ответ

Оказывается, что позиции кнопок в GridLayout устанавливаются когда они создаются, их позиции в листе не влияют на макет layout.
Поэтому нам нужно будет создать еще одну коллекцию с параметризованым типом: List params = new ArrayList<>();
И только потом уже можно применять Collections.shuffle(params);
А метод gridLayout.invalidate() тут точно не нужен.

Комментариев нет:

Отправить комментарий