Высота Gridview снижается

Я пытаюсь отобразить 8 элементов внутри gridview. К сожалению, высота сетки всегда слишком мала, так что она отображает только первую строку и небольшую часть секунды.

Настройка android:layout_height="300dp" заставляет его работать. wrap_ content и fill_parent видимому, нет.

Мой вид сетки:

  

Ресурс моих товаров:

      

Проблема не связана с отсутствием вертикального пространства.

Что я могу сделать ?

После (слишком много) исследований я наткнулся на отличный ответ Нейла Трэйфта .

Адаптация его работы для 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); } 
  • Как установить все приложение только в портретном режиме?
  • Firebase: запрос для исключения данных на основе условия
  • AlphabetIndexer с пользовательским адаптером, управляемый LoaderManager
  • Android Home Screen Widget (значок, стиль ярлыка)
  • Google Maps Android API v2 - обнаружение касания на карте
  • Динамическое содержимое в Maps V2 InfoWindow
  • Динамическое создание кнопок и установка onClickListener
  • GoogleService не удалось инициализировать
  • Какова реальная точность телефонных акселерометров при использовании для позиционирования?
  • Как настроить кнопку переключателя?
  • MediaPlayer.setDataSource () и prepare () не работает - андроид
  • Давайте будем гением компьютера.