GridView. Создание квадратных элементов

GridView позволяет выводить элементы в виде сетки, но что если я хочу, чтобы эти элементы были строго квадратными на любом устройстве, тут есть решение.

Я нашел много решений на stack overflow но большинство из них было с багами либо с очень геморройной реализацией. После этого я решил не мудрить и сделать свой кастомный компонент, не пугайтесь это только звучит страшно.

Что нам надо сделать?

 

Решение

Для примера я взял исходники с этого урока GridView кастомный адаптер и туда дописал свой кастомный компонент.

Создаем пакет componet и в нем создаем класс CustomButton, как вы уже возможно поняли, мы поменяем нашу кнопку, а точней её поведение. Теперь унаследуем наш CustomButton от Button и переопределим все 3 его конструктора.

public CustomButton(Context context) {
    super(context);
}

public CustomButton(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public CustomButton(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

И теперь чтобы наш компонент всегда по высоте был такой же, как по ширине надо переопределить два метода, как показано в листинге ниже:

package com.devcolibri.gridviewcustomadapter.app.component;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.Button;

public class CustomButton extends Button {

    public CustomButton(Context context) {
        super(context);
    }

    public CustomButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
        final int width = getDefaultSize(getSuggestedMinimumWidth(),widthMeasureSpec);
        setMeasuredDimension(width, width);
    }

    @Override
    protected void onSizeChanged(final int w, final int h, final int oldw, final int oldh) {
        super.onSizeChanged(w, w, oldw, oldh);
    }

}

Первый метод onMeasure() будет вызываться при инициализации нашего компонента, и в нем мы получаем ширину и проставляем этим значением высоту компонента.

Второй метод onSizeChanged() будет вызываться, когда мы меняем состояние вида, например переворачиваем в landscape вид, тут тоже поведение, но в этом случае мы уже знаем ширину компонента, поэтому нам достаточно проставить высоту.

В результате получим:

Урок создан: 09 августа 2014 | Просмотров: 17323 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

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

  • 10 августа 2014 в 22:28

    Олег

    Привет Саш, спасибо большое за уроки по Андроиду, все понятно и интересно. Есть один вопрос по данной теме. Допустим есть некая таблица с 3 колонками, в данной таблице записаны цифры от 1 до 10. Также есть EditText в который пользователь записывает своё число. Так вот вопрос, как сделать так что-бы программа проверяла содержимое каждой ячейки таблицы и делала фон определённой ячейки другого цвета если данная ячейка содержит число которое ввел пользователь? Заранее благодарен за ответ.

    • 11 августа 2014 в 10:22

      Александр Барчук

      Здравствуйте, вам нужно повешать хендлер на GridView и при вводе значения пройтись по всем элементам таблицы, и получить необходимое вам значение, я бы создал свой компонент для этого, но тут несолько путей решения.

      • 11 августа 2014 в 21:46

        Олег

        А можешь описать некоторые пути решения (либо дать ссылки где можно почитать). Я в программировании под Андроид начинающий. И еще, можно как-то поменять фон ячейки в таблице, либо цвет текста внутри ячейки (это важно)? Спасибо за ответ.

        • 11 августа 2014 в 22:47

          Александр Барчук

          По поводу элемента в ячейке так это нужно конфигурить в CustomButton.

          • 11 августа 2014 в 23:01

            Олег

            Спасибо за помощь и продолжай записывать уроки по андроиду очень помогает в изучении. Удачи тебе.

  • 18 января 2015 в 13:01

    Иван

    Здравствуйте Александр! У меня вопрос: Вы планируете сделать видеоуроки по java ee?

  • 17 апреля 2016 в 18:55

    Антон

    Здравствуйте, не получается реализовать Ваш пример, добавил пакет componet и в нем создал класс CustomButton, в классе прописал данный код который Вы предоставили, но при тесте ничего не изменилось, кнопки остались такими же (с этого урока GridView кастомный адаптер), может что то еще нужно дописать? или добавить какой модуль?