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
9 комментариев к статье "GridView. Создание квадратных элементов"
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.
Привет Саш, спасибо большое за уроки по Андроиду, все понятно и интересно. Есть один вопрос по данной теме. Допустим есть некая таблица с 3 колонками, в данной таблице записаны цифры от 1 до 10. Также есть EditText в который пользователь записывает своё число. Так вот вопрос, как сделать так что-бы программа проверяла содержимое каждой ячейки таблицы и делала фон определённой ячейки другого цвета если данная ячейка содержит число которое ввел пользователь? Заранее благодарен за ответ.
Здравствуйте, вам нужно повешать хендлер на GridView и при вводе значения пройтись по всем элементам таблицы, и получить необходимое вам значение, я бы создал свой компонент для этого, но тут несолько путей решения.
А можешь описать некоторые пути решения (либо дать ссылки где можно почитать). Я в программировании под Андроид начинающий. И еще, можно как-то поменять фон ячейки в таблице, либо цвет текста внутри ячейки (это важно)? Спасибо за ответ.
По поводу элемента в ячейке так это нужно конфигурить в CustomButton.
Спасибо за помощь и продолжай записывать уроки по андроиду очень помогает в изучении. Удачи тебе.
Здравствуйте Александр! У меня вопрос: Вы планируете сделать видеоуроки по java ee?
Да, в группе ВК про это писалось.
Здравствуйте, не получается реализовать Ваш пример, добавил пакет componet и в нем создал класс CustomButton, в классе прописал данный код который Вы предоставили, но при тесте ничего не изменилось, кнопки остались такими же (с этого урока GridView кастомный адаптер), может что то еще нужно дописать? или добавить какой модуль?
Дай Бог Вам здоровья.