127 votes

La hauteur de Gridview est coupée

J'essaie d'afficher 8 éléments dans un gridview. Malheureusement, la hauteur de grille est toujours trop petite pour ne montrer que la première ligne et une petite partie de la seconde.

Le réglage android:layout_height="300dp" fait fonctionner. wrap_ content et fill_parent apparemment pas.

Ma vue en grille:

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

Ma ressource en articles:

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


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

La question ne semble pas liée à un manque d'espace vertical.

Que puis-je faire ?

361voto

tacone Points 4362

Après (trop) de recherches, je suis tombé sur l'excellente réponse de Neil Traft .

Adapter son travail au GridView a été extrêmement facile.

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

Incluez-le dans votre mise en page comme ceci:

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

Enfin, il vous suffit de lui demander d’agrandir:

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

6voto

Pelanes Points 744

Une autre approche similaire qui a fonctionné pour moi est de calculer la hauteur d’une ligne, puis avec des données statiques (vous pouvez l’adapter à la pagination), vous pouvez calculer le nombre de lignes que vous avez et redimensionner facilement la hauteur de 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);
}
 

Utilisez ce code après avoir configuré l’adaptateur et lorsque GridView est dessiné ou vous obtiendrez height = 0.

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

0voto

Uday Sravan K Points 51

Il suffit de calculer la hauteur pour AT_MOST et de définir sur mesure. Ici, GridView Scroll ne fonctionnera pas. Besoin d'utiliser explicitement la vue de défilement vertical.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X