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

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 вид, тут тоже поведение, но в этом случае мы уже знаем ширину компонента, поэтому нам достаточно проставить высоту.

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

ПОХОЖИЕ ПУБЛИКАЦИИ

    None Found

27884
09/08/2014

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

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

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

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

  4. Дай Бог Вам здоровья.

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

Сайт использует cookie-файлы для того, чтобы вам было удобнее им пользоваться. Для продолжения работы с сайтом, вам необходимо принять использование cookie-файлов.

Я ознакомлен(а)