web-dev-qa-db-fra.com

Définir la hauteur de ligne GridView fixe

J'ai toutes sortes de problèmes avec les hauteurs de ligne dans GridView.

Je voudrais définir la taille des éléments (hauteur/largeur) en XML, puis avoir juste l'ajustement automatique de GridView autant qu'ils le peuvent sans étirement. S'il ne peut pas contenir l'élément suivant, il doit simplement ajouter un rembourrage autour du nombre actuel d'éléments qu'il a pu contenir.

Actuellement, je reçois 2 colonnes (ce qui me semble presque de taille fixe) et les lignes sont étirées. Quelqu'un pourrait-il m'aider à expliquer ce qui se passe et comment réaliser ce que je veux?

GridView:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:id="@+id/main_grid"
    Android:numColumns="auto_fit"
    Android:gravity="center"
    Android:paddingRight="20dp"
    Android:paddingLeft="20dp"
    Android:clipToPadding="true"
    Android:fitsSystemWindows="true"
    Android:stretchMode="none"
    Android:background="@drawable/main_grid_background">

</GridView>

GridItem (je le veux 320x320 car j'insère plus tard une image d'arrière-plan qui semble étrange si ce n'est pas un carré parfait).

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="320dp"
    Android:layout_height="320dp"
    Android:padding="10dp" >

    <TextView
        Android:id="@+id/grid_item_label"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:singleLine="true"
        Android:text="@+id/label"
        Android:layout_marginTop="5dp"
        Android:textColor="@color/black"
        Android:textSize="15sp"
        Android:visibility="invisible"
        Android:layout_centerInParent="true" >
    </TextView>

</RelativeLayout>

Java:

public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View gridView;

        if (convertView == null) {

            gridView = new View(context);

            // get layout from mobile.xml
            gridView = inflater.inflate(R.layout.main_grid_item, null);

        } else {
            gridView = (View) convertView;
        }
        TextView textView = (TextView) gridView
                .findViewById(R.id.grid_item_label);

            //SET TEXT AND BACKGROUND IMAGE HERE
            //gridView.setBackgroundResource(R.drawable.main_grid_item_import);



        return gridView;
    }
13
AlexIIP

Donc, ce n'est pas une réponse parfaite mais c'est comme ça que je l'ai fait fonctionner. Idées empruntées à this thread.

Tout cela fonctionne en supposant que je connais mes tailles d'image, qui sont 320x320. De plus, dans GridView, je devais définir Android:columnWidth="320dp" ou cela ne fonctionnerait pas. Si quelqu'un a une meilleure idée, merci de la poster ... pour l'instant je continue.

Élément XML de la grille:

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:padding="10dp" >
    <ImageView
    Android:id="@+id/grid_item_image"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_centerInParent="true"/>
    <TextView
        Android:id="@+id/grid_item_label"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:singleLine="true"
        Android:text="@+id/label"
        Android:textColor="@color/black"
        Android:layout_alignLeft="@+id/grid_item_image"
        Android:layout_alignTop="@+id/grid_item_image"
        Android:layout_alignRight="@+id/grid_item_image"
        Android:layout_alignBottom="@+id/grid_item_image"
        Android:gravity="center"
        Android:textSize="15sp"
        Android:visibility="invisible">
    </TextView>

</RelativeLayout>

GridView XML:

<GridView 
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:id="@+id/main_grid"
    Android:numColumns="auto_fit"
    Android:gravity="center"
    Android:columnWidth="320dp"
    Android:paddingRight="20dp"
    Android:paddingLeft="20dp"
    Android:clipToPadding="true"
    Android:fitsSystemWindows="true"
    Android:stretchMode="columnWidth"
    Android:background="@drawable/main_grid_background">
</GridView>
4
AlexIIP

Dans le CustomAdapter

v.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, rowHigh));

rowHigh est la dimension que vous devez modifier

49
Boris Karloff
public class MyGridView extends GridView {
    public MyGridView(Context context) {
        super(context);
    }

    public MyGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyGridView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int heightSpec;

        if (getLayoutParams().height == LayoutParams.WRAP_CONTENT) {
            // The great Android "hackatlon", the love, the magic.
            // The two leftmost bits in the height measure spec have
            // a special meaning, hence we can't use them to describe height.
            heightSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
        } else {
            heightSpec = heightMeasureSpec;
        }

        super.onMeasure(widthMeasureSpec, heightSpec);
    }


}

En XML:

<MyGridView 
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:id="@+id/main_grid"
    Android:gravity="center"/>
4
Hitendra Joshi