Die Gridview-Höhe wird reduziert

Lesezeit: 6 Minuten

Die Gridview Hohe wird reduziert
Tacon

Ich versuche, 8 Elemente in einer Gridview anzuzeigen. Leider ist die Gridview-Höhe immer zu gering, sodass nur die erste Zeile und ein kleiner Teil der zweiten angezeigt wird.

Einstellung android:layout_height="300dp" macht es funktioniert. wickeln_content und fill_parent scheinbar nicht.

Meine Rasteransicht:

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

Ressourcen für meine Artikel:

<?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="https://stackoverflow.com/questions/8481844/@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>

Das Problem scheint nicht mit einem Mangel an vertikalem Platz zusammenzuhängen.

Was kann ich tun ?

  • Beantwortet das deine Frage? Wie man eine GridView hat, die ihre Höhe anpasst, wenn Elemente hinzugefügt werden

    – Shivam Agarwal

    23. Mai 2020 um 15:54 Uhr

Die Gridview Hohe wird reduziert
Tacon

Nach (zu viel) Recherche bin ich auf die hervorragende Antwort von Neil Traft gestoßen.

Anpassung seiner Arbeit für die GridView war kinderleicht.

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

Fügen Sie es wie folgt in Ihr Layout ein:

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

Zuletzt müssen Sie es nur bitten, es zu erweitern:

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

  • Diese Lösung ist nicht speichereffizient und die App stürzt ab, wenn es sich bei den Zellen um Bilder handelt. Diese Lösung teilt der Scrollview mit, wie hoch die vollständige Gridview ist, damit sie nach unten gehen kann, aber das Problem besteht darin, dass dabei alles gerendert wird, ohne Recycling zu verwenden. Nicht mehr als 200 Artikel könnten funktionieren.

    – Mariano Latorre

    31. Mai 2013 um 15:20 Uhr

  • @adamp Ich denke, dafür gibt es nützliche Fälle. Wenn Sie eine begrenzte Anzahl von Elementen haben, die in einem 2D-Array angezeigt werden sollen, scheint die Verwendung dieser Art von GridView einfacher zu sein, als zu versuchen, eine Art benutzerdefiniertes / dynamisches TableLayout zu erstellen, oder?

    – greg7gkb

    7. Juni 2013 um 20:15 Uhr

  • Funktioniert bei mir nicht, ich habe ExpandableHeightGridView unter ScrollView gesetzt, es schneidet die letzte Ansicht ab.

    – Chirag Nagariya

    24. Juli 2013 um 7:28 Uhr

  • @tacone Es gibt eine Reihe besserer Lösungen für diese Art von Problem, die im Framework, in der Support-Bibliothek und in anderem Open-Source-Code im Internet verfügbar sind. Die einfachste davon kann eine einfache for-Schleife sein, die Ansichten von einem Adapter oder anderswo abruft und Hinzufügen zu einem GridLayout, (nicht GridView; GridLayout ist auch in der Support-Bibliothek verfügbar), TableLayout oder ähnlichem.

    – dämpfen

    25. März 2014 um 16:34 Uhr

  • @adamp Wenn das nicht gut ist, fügen Sie bitte Ihre Antwort mit der besten Lösung hinzu, die Ihnen einfällt

    – aleb

    24. Juli 2014 um 22:24 Uhr

Nachdem ich die Antwort von @tacone verwendet und sichergestellt hatte, dass sie funktionierte, beschloss ich, den Code zu verkürzen. Das ist mein Ergebnis. PS: Es ist das Äquivalent dazu, dass das boolesche “erweitert” in der Tacones-Antwort immer auf wahr gesetzt ist.

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

  • Aber warten Sie – dies leidet immer noch unter dem Problem der Speichernutzung; Sie recyceln nicht mehr richtig?

    – Fett

    29. November 2016 um 16:29 Uhr

1646320386 938 Die Gridview Hohe wird reduziert
Pelan

Ein anderer ähnlicher Ansatz, der für mich funktioniert hat, besteht darin, die Höhe für eine Zeile zu berechnen und dann mit statischen Daten (Sie können sie an die Paginierung anpassen) zu berechnen, wie viele Zeilen Sie haben, und die Größe der GridView-Höhe einfach zu ändern.

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

Verwenden Sie diesen Code nach dem Einstellen des Adapters und wenn die GridView gezeichnet wird, oder Sie erhalten Höhe = 0.

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

  • Das hat bei mir gut funktioniert – ich verwende eine Reihe von GridViews in einer ListView. Ich bin mir noch nicht sicher, ob das eine schlechte Idee ist oder nicht – Sie müssen die Leistung mit einem großen Datensatz untersuchen. Aber trotzdem danke für den Code. Ich denke, es gibt jedoch einen Off-by-One-Fehler – ich musste verwenden int rows = items / columns + 1;

    – Andreas

    27. November 2014 um 3:12 Uhr


  • Für unter Android OS 5.0 erhalte ich diesen Fehler java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams

    – SilberFuchsA

    6. Juni 2015 um 4:57 Uhr

  • ViewGroup.LayoutParams params = gridView.getLayoutParams(); wirft eine NullPointerException

    – Lukas Allison

    1. Juni 2016 um 11:11 Uhr

Die Gridview Hohe wird reduziert
WeltraumMonster

Tacones-Antwort hilfreich gefunden … also habe ich es auf C # (Xamarin) portiert

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

1646320388 747 Die Gridview Hohe wird reduziert
CoolMind

Jacob R Lösung in Kotlin:

class ExpandableHeightGridView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : GridView(context, attrs, defStyleAttr) {

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        val expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK,
            MeasureSpec.AT_MOST)
        super.onMeasure(widthMeasureSpec, expandSpec)
        layoutParams.height = measuredHeight
    }
}

Nach dem Hinzufügen GridView zu RecyclerView Ich habe eine in voller Größe GridView (alle Zeilen sind sichtbar), wie erwartet.

1646320389 814 Die Gridview Hohe wird reduziert
Narkha

Berechnen Sie einfach die Höhe für AT_MOST und setzen Sie sie auf Maß. Hier funktioniert GridView Scroll also nicht. Vertikale Bildlaufansicht muss explizit verwendet werden.

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

924660cookie-checkDie Gridview-Höhe wird reduziert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy