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

254
29 января 2018, 05:51

Здравствуйте. Помогите разобраться в чем может быть проблема. Написал вот такой код и в нем есть описание действий:

    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();

Картинка на выходе не та, что ожидалась по логике, кнопки должны были перемешаться:

Answer 1

Оказывается, что позиции кнопок в GridLayout устанавливаются когда они создаются, их позиции в листе не влияют на макет layout.

Поэтому нам нужно будет создать еще одну коллекцию с параметризованым типом: List<GridLayout.LayoutParams> params = new ArrayList<>();

И только потом уже можно применять Collections.shuffle(params);

А метод gridLayout.invalidate() тут точно не нужен.

READ ALSO
Android удаление элемента из массива

Android удаление элемента из массива

У меня есть программно создаваемые записи, это TextView и его CheckboxМне нужно изменить код, чтобы при определенных условиях удалить их вместе

252
retrofit аутентификация не работает.

retrofit аутентификация не работает.

Я создаю приложение аутентификации, у меня есть 3 методы, первый регистрирует юзера, второй получает client id and secret, а третий получает access and refresh...

302
Ответ на сообщение WebSocket

Ответ на сообщение WebSocket

Подскажите пожалуйстаЕсть ли или как-то можно реализовать систему ответа в websocket на входящее сообщение

171
JAX-RS не создает deployment descripot

JAX-RS не создает deployment descripot

Добрый деньПочему то при создании JAX-rs конфиги создаюмя в классе а не в xml файле как это исправить:?

138