Высота Gridview снижается
Я пытаюсь отобразить 8 элементов внутри gridview. К сожалению, высота сетки всегда слишком мала, так что она отображает только первую строку и небольшую часть секунды.
Настройка android:layout_height="300dp"
заставляет его работать. wrap_ content
и fill_parent
видимому, нет.
Мой вид сетки:
- SecurityException: caller uid XXXX отличается от идентификатора аутентификатора
- Ошибка манифеста слияния
- Как программно добавлять представления в представления
- Как обрабатывать сообщения обработчика, когда действие / fragment приостановлено
- Широковещание при добавлении / изменении контакта?
Ресурс моих товаров:
Проблема не связана с отсутствием вертикального пространства.
Что я могу сделать ?
- Использование Intent в приложении Android для отображения другого действия
- Как показать дерево зависимостей в Android Studio?
- Как я могу избежать «IllegalStateException: Scrollview может содержать только одного прямого ребенка»?
- Ошибка Android - вызвана: java.lang.NoClassDefFoundError: android.support.v4.util.SparseArrayCompat
- Службы Google Play устарели. Требуется 10084000, но найдено 9879470. Не удается обновить
- Расположение координатора с панелью инструментов во fragmentах или действиях
- Почтовый запрос Volley JsonObjectRequest не работает
- Может ли Android SDK работать с JDK 1.7?
После (слишком много) исследований я наткнулся на отличный ответ Нейла Трэйфта .
Адаптация его работы для GridView
была безрезультатной.
ExpandableHeightGridView.java:
package com.example; public class ExpandableHeightGridView extends GridView { boolean expanded = false; public ExpandableHeightGridView(Context context) { super(context); } public ExpandableHeightGridView(Context context, AttributeSet attrs) { super(context, attrs); } public ExpandableHeightGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public boolean isExpanded() { return expanded; } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // HACK! TAKE THAT ANDROID! if (isExpanded()) { // Calculate entire height by providing a very large height hint. // View.MEASURED_SIZE_MASK represents the largest height possible. int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); ViewGroup.LayoutParams params = getLayoutParams(); params.height = getMeasuredHeight(); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } public void setExpanded(boolean expanded) { this.expanded = expanded; } }
Включите его в свой макет следующим образом:
Наконец, вам просто нужно попросить его расширить:
mAppsGrid = (ExpandableHeightGridView) findViewById(R.id.myId); mAppsGrid.setExpanded(true);
После использования ответа от @tacone и убедившись, что это сработало, я решил попробовать закорачивать код. Это мой результат. PS: Это эквивалент того, что логический «расширенный» в ответе tacones всегда задан как true.
public class StaticGridView extends GridView { public StaticGridView(Context context) { super(context); } public StaticGridView(Context context, AttributeSet attrs) { super(context, attrs); } public StaticGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, MeasureSpec.AT_MOST)); getLayoutParams().height = getMeasuredHeight(); } }
Другим подобным подходом, который работал для меня, является вычисление высоты для одной строки, а затем со статическими данными (вы можете адаптировать ее к paginate), вы можете рассчитать, сколько строк у вас есть и легко resize GridView.
private void resizeGridView(GridView gridView, int items, int columns) { ViewGroup.LayoutParams params = gridView.getLayoutParams(); int oneRowHeight = gridView.getHeight(); int rows = (int) (items / columns); params.height = oneRowHeight * rows; gridView.setLayoutParams(params); }
Используйте этот код после установки адаптера и при рисовании GridView, или вы получите height = 0.
gridView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (!gridViewResized) { gridViewResized = true; resizeGridView(gridView, numItems, numColumns); } } });
Найденные tacones отвечают полезными … поэтому я портировал его на C # (Xamarin)
public class ExpandableHeightGridView: GridView { bool _isExpanded = false; public ExpandableHeightGridView(Context context) : base(context) { } public ExpandableHeightGridView(Context context, IAttributeSet attrs) : base(context, attrs) { } public ExpandableHeightGridView(Context context, IAttributeSet attrs, int defStyle) : base(context, attrs, defStyle) { } public bool IsExpanded { get { return _isExpanded; } set { _isExpanded = value; } } protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec) { // HACK! TAKE THAT ANDROID! if (IsExpanded) { // Calculate entire height by providing a very large height hint. // View.MEASURED_SIZE_MASK represents the largest height possible. int expandSpec = MeasureSpec.MakeMeasureSpec( View.MeasuredSizeMask, MeasureSpecMode.AtMost); base.OnMeasure(widthMeasureSpec,expandSpec); var layoutParameters = this.LayoutParameters; layoutParameters.Height = this.MeasuredHeight; } else { base.OnMeasure(widthMeasureSpec,heightMeasureSpec); } } }
Просто вычислите высоту для AT_MOST и установите значение по мере. Здесь GridView Scroll не работает. Необходимо явно использовать вертикальный просмотр прокрутки.
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int heightSpec; if (getLayoutParams().height == LayoutParams.WRAP_CONTENT) { heightSpec = MeasureSpec.makeMeasureSpec( Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); } else { // Any other height should be respected as is. heightSpec = heightMeasureSpec; } super.onMeasure(widthMeasureSpec, heightSpec); }