32 Stimmen

Wie man ein GridView, das seine Höhe anpasst, wenn Elemente hinzugefügt werden

Ich versuche, eine dynamisch wachsende Liste von Zeichenfolgen mit einem Kontrollkästchen in einer GridView anzuzeigen, die selbst in einem TableLayout ist.

Ich kann diese "checkboxed" Strings gut in einer Reihe anzeigen. Mein Problem tritt auf, wenn ich den Benutzer dynamisch neue Zeichenfolgen in der GridView hinzufügen lasse.

Ich habe einen benutzerdefinierten Adapter erstellt, der die Liste der Zeichenfolgen empfängt. Angenommen wir haben n Strings. Der Adapter gibt 'n + 1' für die Anzahl der Elemente zurück; in getView, gibt er zurück:

  • eine Ansicht mit einem LinearLayout, die ihrerseits eine CheckBox und einen EditText für die ersten n Elemente enthält,
  • ein LinearLayout mit einer einfachen Schaltfläche mit einer '+'-Beschriftung für das 'n + 1'-te Element.

So weit, so gut. Wenn der '+' Button angeklickt wird, füge ich einen leeren String zur Liste der Strings hinzu und rufe notifyDataSetChanged im Adapter auf.

Die GridView wird mit einem weiteren Element neu gezeichnet. ABER es behält seine ursprüngliche Höhe und erstellt eine vertikale Bildlaufleiste. Ich möchte, dass das GridView seine Höhe erweitert (d. h. mehr Platz auf dem Bildschirm einnimmt und alle Elemente anzeigt).

Ich habe versucht, den Bildschirm in ein vertikales LinearLayout anstelle eines TableLayout zu ändern, aber das Ergebnis ist das gleiche.

Hier ist das Layout meines Bildschirms:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scrollbars="none">
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >

    <!-- other lines omitted -->

    <LinearLayout android:layout_width="fill_parent" 
                  android:layout_height="wrap_content" >
        <TextView
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:text="@string/wine_rack_explanation"
            android:layout_gravity="center_vertical" />
          <GridView
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            android:id="@+id/gvRack"
            android:columnWidth="90dp"    
            android:numColumns="auto_fit" />
    </LinearLayout>

<!-- other lines omitted -->

</LinearLayout>
</ScrollView>

Das Kontrollkästchen + String-Element des Adapters ist wie folgt definiert:

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="horizontal"

  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
    <CheckBox android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:id="@+id/cbCoordinate"
              android:checked="true"
              />
    <EditText android:id="@+id/txtCoordinate"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content" />
</LinearLayout>

Die Schaltfläche "+" ist wie folgt definiert:

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="horizontal"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">

    <Button android:id="@+id/btnAddBottle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/add_bottle_caption" />
</LinearLayout>

Ich habe versucht, invalidate oder invalideViews auf dem GridView aufrufen, nachdem ein Element hinzugefügt wird. Außerdem rief ich invalidate für TableLayout und TableRow (im vorherigen Layout des Bildschirms) auf. Kein Erfolg.

Jede Idee, warum die GridView weigert sich, seine Höhe zu erweitern?

(Beachten Sie, dass ich völlig offen für die Verwendung einer anderen Ansichtsgruppe als der GridView bin)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X