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

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

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

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

 <GridView android:id="@+id/myId" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:horizontalSpacing="2dp" android:isScrollContainer="false" android:numColumns="4" android:stretchMode="columnWidth" android:verticalSpacing="20dp" /> 

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

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:minHeight="?android:attr/listPreferredItemHeight" > <ImageView android:id="@+id/appItemIcon" android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@android:drawable/ic_dialog_info" android:scaleType="center" /> <TextView android:id="@+id/appItemText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="My long application name" android:gravity="center_horizontal" android:textAppearance="?android:attr/textAppearanceSmall" /> </LinearLayout> 

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

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

Solutions Collecting From Web of "Высота Gridview снижается"

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

Адаптация его работы для 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; } } 

Включите его в свой макет следующим образом:

 <com.example.ExpandableHeightGridView android:id="@+id/myId" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:horizontalSpacing="2dp" android:isScrollContainer="false" android:numColumns="4" android:stretchMode="columnWidth" android:verticalSpacing="20dp" /> 

Наконец, вам просто нужно попросить его расширить:

 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(); } } 

Найденные 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); } } } 

Другим подобным подходом, который работал для меня, является вычисление высоты для одной строки, а затем со статическими данными (вы можете адаптировать ее к paginate), вы можете рассчитать, сколько строк у вас есть и легко изменить размер 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); } } }); 

Просто вычислите высоту для 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); }