uso studio numcolumns gridlayout descargar columnas android gridview

studio - menu gridview android



La altura de Gridview se corta (5)

Después de (demasiada) investigación, tropecé con la excelente respuesta de Neil Traft .

Adaptar su trabajo para GridView ha sido muy fácil.

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

Inclúyalo en su diseño de esta manera:

<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" />

Por último, solo tienes que pedirle que expanda:

mAppsGrid = (ExpandableHeightGridView) findViewById(R.id.myId); mAppsGrid.setExpanded(true);

Estoy tratando de mostrar 8 elementos dentro de una vista de cuadrícula. Lamentablemente, la altura de la vista de cuadrícula siempre es demasiado pequeña, por lo que solo muestra la primera fila y una pequeña parte de la segunda.

Configuración android:layout_height="300dp" hace funcionar. wrap_ content y fill_parent aparentemente no.

Mi vista de cuadrícula:

<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" />

Mi recurso de artículos:

<?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>

El problema no parece estar relacionado con la falta de espacio vertical.

Que puedo hacer ?


Después de usar la respuesta de @tacone y asegurarme de que funcionaba, decidí intentar hacer un cortocircuito en el código. Este es mi resultado. PD: Es el equivalente de tener la respuesta booleana "expandida" en tacones siempre establecida en verdadero.

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


Los tacones encontrados responden útil ... así que lo porté a 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); } } }


Otro enfoque similar que funcionó para mí, es calcular la altura de una fila y luego con datos estáticos (puedes adaptarla a la paginación) puedes calcular cuántas filas tienes y cambiar el tamaño de la altura de GridView fácilmente.

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

Use este código después de configurar el adaptador y cuando se dibuje GridView o obtendrá height = 0.

gridView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (!gridViewResized) { gridViewResized = true; resizeGridView(gridView, numItems, numColumns); } } });


Simplemente calcule la altura para AT_MOST y configúrela en medida. Aquí GridView Scroll no funcionará. Necesita usar la vista de desplazamiento vertical explícitamente.

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