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.
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
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
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);
}
}
}
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.
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);
}
9246600cookie-checkDie Gridview-Höhe wird reduziertyes
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