wake-up-neo.com

Begrenzung der Höhe von ListView auf Android

Ich möchte einen Button unter einer ListView anzeigen. Problem ist, wenn die ListView erweitert wird (Elemente hinzugefügt ...), wird die Schaltfläche aus dem Bildschirm gedrückt. 

Ich habe eine LinearLayout mit Gewichten ausprobiert (wie in Android vorgeschlagen: Warum gibt es kein maxHeight für eine Ansicht? ), aber entweder habe ich die Gewichte falsch verstanden oder es hat einfach nicht funktioniert. 

Außerdem habe ich irgendwo den Hinweis gefunden, eine RelativeLayout zu verwenden. Die Variable ListView würde dann mit dem Parameter Android:layout_above über der Schaltfläche gesetzt. 

Das Problem dabei ist, dass ich nicht weiß, wie ich den Knopf danach positionieren soll. In dem Beispiel, das ich gefunden habe, wurde die Ansicht unter der ListView mit Android:layout_alignParentBottom angepasst, aber ich möchte nicht, dass meine Schaltfläche am unteren Rand des Bildschirms haftet. 

Irgendwelche Ideen außer der Verwendung der setHeight-Methode und der Berechnung des Platzbedarfs?


Edit: Ich habe viele nützliche Antworten erhalten.

  • die Lösung von bigstone & user639183 fast hat perfekt funktioniert. Ich musste jedoch eine zusätzliche Polsterung/Rand an der Unterseite der Schaltfläche hinzufügen, da sie immer noch halb aus dem Bildschirm gedrückt werden würde (dann aber angehalten wurde).

  • Adinias Antwort mit dem relativen Layout ist gut, wenn Sie möchten, dass die Schaltfläche am unteren Rand des Bildschirms angezeigt wird. Es ist nicht das, was ich beabsichtigt habe, es könnte aber für andere nützlich sein.

  • Die Lösung von AngeloS war die, die ich am Ende gewählt habe, da sie gerade die gewünschten Effekte erzeugt hat. Ich habe jedoch zwei kleine Änderungen an der LinearLayout um den Button vorgenommen: 

    • Da ich in meinem Layout keine absoluten Werte haben wollte, änderte ich Android:layout_height="45px" in wrap_content, was ebenfalls gut funktioniert. 

    • Zweitens, da ich wollte, dass der Button horizontal zentriert wird, was nur von verticalLinearLayout unterstützt wird, habe ich Android geändert: Orientierung = "horizontal" in "vertikal". 

    AngeloS erklärte auch in seinem ersten Beitrag, dass er nicht sicher sei, ob der Android:layout_weight="0.1"-Parameter in der LinearLayout um die ListView eine Wirkung hatte; Ich habe es gerade ausprobiert und tut es auch! Ohne wird die Taste wieder aus dem Bildschirm gedrückt.

86
jellyfish

Ich hatte genau dieses Problem und um das Problem zu lösen, habe ich zwei getrennte LinearLayouts erstellt, in denen jeweils ListView und Button untergebracht sind. Von dort füge ich beide in einen anderen Linear Layout ein und setze Android:orientation dieses Containers auf vertical. Ich habe auch die Gewichtung von LinearLayout, der ListView enthielt, auf 0.1 eingestellt. Von dort aus können Sie die Höhe des unteren Containers (mit der Schaltfläche) auf die gewünschte Höhe einstellen.

EDITdas meine ich:

<LinearLayout
  xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:layout_width="fill_parent"
  Android:layout_height="fill_parent"
  Android:orientation="vertical">

  <LinearLayout
        Android:orientation="horizontal"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="0.1"
        >   



                  <ListView Android:id="@+id/ListView01" 
                    Android:layout_height="fill_parent"
                    Android:layout_width="fill_parent"
                    Android:dividerHeight="2px">
                 </ListView>



    </LinearLayout> 

<LinearLayout
    Android:orientation="horizontal"
    Android:layout_width="fill_parent"
    Android:layout_height="45px"
    Android:background="@drawable/drawable" 
    > 


                <Button Android:background="@drawable/btn_more2"                     
                     Android:id="@+id/moreButton"
                     Android:layout_width="wrap_content"
                     Android:layout_height="fill_parent"
                     Android:layout_alignParentRight="true"
                     Android:paddingRight="20px"
                     />

</LinearLayout>
</LinearLayout>

Die obige Lösung fixiert die Schaltfläche am unteren Rand des Bildschirms.


Ändern Sie die Höhe von ListView01 in wrap_content, damit die Schaltfläche am unteren Rand der Liste angezeigt wird:

<LinearLayout
  xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:layout_width="fill_parent"
  Android:layout_height="wrap_content"
  Android:orientation="vertical">

  <LinearLayout
        Android:orientation="horizontal"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="0.1"
        >   

        <ListView Android:id="@+id/ListView01" 
                    Android:layout_height="wrap_content"
                    Android:layout_width="fill_parent"
                    Android:dividerHeight="2px">
                 </ListView>



    </LinearLayout> 

<LinearLayout
    Android:orientation="horizontal"
    Android:layout_width="fill_parent"
    Android:layout_height="45px"
    Android:background="@drawable/drawable" 
    > 


                <Button Android:background="@drawable/btn_more2"                     
                     Android:id="@+id/moreButton"
                     Android:layout_width="wrap_content"
                     Android:layout_height="fill_parent"
                     Android:layout_alignParentRight="true"
                     Android:paddingRight="20px"
                     />

</LinearLayout>
</LinearLayout>
51
AngeloS

Ich habe dieses Problem im Code gelöst und die Höhe der Listenansicht nur festgelegt, wenn mehr als 5 Elemente enthalten sind:

if(adapter.getCount() > 5){
        View item = adapter.getView(0, null, listView);
        item.measure(0, 0);         
        ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, (int) (5.5 * item.getMeasuredHeight()));
        listView.setLayoutParams(params);
}

Beachten Sie, dass ich die maximale Höhe auf das 5,5-fache der Höhe eines einzelnen Elements festgelegt habe, sodass der Benutzer sicher ist, dass ein Bildlauf erforderlich ist. :)

61
shaylh

Bei Ihrer letzten Bearbeitung müssen Sie lediglich Android:layout_above="@+id/butt1" in Ihren ListView-Code einfügen. 

Und um Ihnen (und allen, die zuvor eine Antwort versucht haben) zu zeigen, dass Sie wirklich nicht mehr als eine RelativeLayout verwenden müssen, ist hier Ihr korrigierter Code :

   <RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:background="@drawable/bkg">
    <TextView
        Android:id="@+id/textView1"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:text="TextView1"
        Android:layout_alignParentTop="true">
    </TextView>
    <TextView
        Android:id="@+id/textView2"
        Android:layout_below="@+id/textView1"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:text="TextView2"
        Android:layout_centerHorizontal="true">
    </TextView>
    <Button
        Android:id="@+id/butt1"
        Android:text="string/string3"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerHorizontal="true"
        Android:layout_alignParentBottom="true">
    </Button>
    <ListView
        Android:id="@+id/Android:list"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="2dip"
        Android:layout_marginBottom="2dip"
        Android:drawSelectorOnTop="false"
        Android:visibility="visible"
        Android:layout_below="@+id/textView2"
        Android:layout_above="@+id/butt1" />
    </RelativeLayout>

und das Ergebnis mit einer zufälligen Liste:
enter image description here

21
Adinia

Stellen Sie mit LinearLayout die Höhe Ihrer ListView und Button auf wrap_content ein und fügen Sie ListView ein Gewicht = 1 hinzu. Dies sollte so funktionieren, wie Sie möchten.
.__ und ja, setzen Sie den layout_gravity der Button auf bottom

6
ernazm

RelativeLayout ist eine Lösung. Wenn Sie nicht möchten, dass die Schaltfläche zu nahe am unteren Rand bleibt, können Sie Ränder hinzufügen (durch Auffüllen einer Schaltfläche würde die Taste beschädigt, da sie einen Hintergrund mit 9 Patches verwendet und ihre eigene Auffüllung festgelegt wird).

Das Gleiche wäre, wenn Sie eine LinearLayout verwenden würden: Sie erreichen die gewünschte Variable, indem Sie die ListView auf eine Höhe = 0 und ein Gewicht von 1 setzen, und für die Schaltfläche height = wrap_content und weight = 0. (Wenn Sie beides auf wrap_content setzen, würde, wie der Benutzer639183 sagte, die Höhe von ListView nicht begrenzt).

5
bigstones

Es wurde ein Weg gefunden, dies ohne geschachtelte Container zu tun, inspiriert von der AngeloS-Lösung. 

Ich habe eine LinearLayout mit vertikaler Ausrichtung verwendet, die eine ListView und eine Schaltfläche hat. Ich habe den Android:layout_weight="0.1" für ListView eingestellt. 

Es gelingt, den Knopf immer an der Unterseite der Liste zu platzieren. Die Schaltfläche wird nicht vom Bildschirm gedrückt, wenn die Liste wächst.

<ListView
    Android:id="@+id/notes_list"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_weight="0.1"        
    />

<Button
    Android:id="@+id/create_note_btn"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"        
    Android:onClick="onCreateButtonClicked"
    Android:text="@string/create_notes"
    />
5
Sparkle

Dies ist der sauberste Weg, dies zu tun:

<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical">
  <ListView
      Android:id="@+id/ListView01"
      Android:layout_width="fill_parent"
      Android:layout_height="0dp"
      Android:layout_weight="1"
      Android:dividerHeight="2px">
  </ListView>
  <FrameLayout
      Android:layout_width="fill_parent"
      Android:layout_height="wrap_content"
      Android:background="@drawable/drawable"
      >
    <Button Android:background="@drawable/btn_more2"
        Android:id="@+id/moreButton"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentRight="true"
        Android:paddingRight="20px"
        />    
  </LinearLayout>
</LinearLayout>

Es ist der Lösung von Angelos ähnlich, aber Sie benötigen nicht das lineare Layout, das die ListView zusammenfasst. Sie können auch ein FrameLayout verwenden, das im Vergleich zu einem LinearLayout leichter ist, um die Schaltfläche zusammenzufassen.

2
user2994360

Sie können dies wahrscheinlich mit verschachtelten Containern durchführen. Möglicherweise müssen Sie den Button in einen zweiten (inneren) Container einwickeln, um mehr Platz zu beanspruchen, und den Button an der Oberseite des inneren Containers ausrichten.

Möglicherweise so etwas:

RelativesLayout

-- Listenansicht

- RelativesLayout

---- Taste

Mit den verschiedenen Ausrichtungsoptionen der beiden Container sollten Sie dies in die Lage versetzen.

2
Rich

Die Idee wird in den sehr guten Lösungen umrissen durch:

Beide scheinen zumindest auf v4.4.3 perfekt zu funktionieren.

Ich musste noch etwas Zeit damit verbringen, Testcode zu schreiben, um die Methode zu überprüfen und zu bestätigen. Unten ist der eigenständige, minimale Testcode erforderlich.


Das Layout basiert auf der Lösung von Sparkle, da es weniger verschachtelte Layouts enthält. Es wurde auch aktualisiert, um die aktuellen LINT-Prüfungen anzuzeigen.

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical"
    tools:context="MainActivity" >

    <ListView
        Android:id="@+id/listview"
        Android:layout_width="fill_parent"
        Android:layout_height="0dp"
        Android:layout_weight="1" />

    <Button
        Android:id="@+id/btn"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:text="Grow List"
        tools:ignore="HardcodedText" />

</LinearLayout>

Activity stellt den Boilerplate-Code bereit, um die Lösung für sich selbst zu testen. 

public class MainActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ListView listview = (ListView)findViewById(R.id.listview);
        final ArrayAdapter<String> adapter = 
                new ArrayAdapter<String>(this,
                                         Android.R.layout.simple_list_item_1,
                                         new ArrayList<String>());
        adapter.setNotifyOnChange(true);
        listview.setAdapter(adapter);

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                int count = adapter.getCount();
                adapter.add(String.valueOf(count));
                listview.setSelection(count);
            }
        });
    }
}

Fühlen Sie sich frei, hinzuzufügen oder zu verbessern, da dies "Community-Wiki" ist.

2

Versuchen Sie, RelativeLayout mit der Schaltfläche unten zu verwenden. Legen Sie die Höhe des Layouts als "wrap_content" ..__ fest. Ich habe es nicht probiert. Nur eine Idee

1
Maxim

fügen Sie in LinearLayout einfach Android:layout_weight="1" zu Ihrer ListView hinzu

1
DawnYu

Folgendes ist was für mich gearbeitet hat ...

 if(adapter.getCount() > 3){
                    View item = adapter.getView(0, null, impDateListView);
                    item.measure(0, 0);         
                    LayoutParams params = impDateListView.getLayoutParams();
                    params.width = LayoutParams.MATCH_PARENT;
                    params.height = 3 * item.getMeasuredHeight();
                    impDateListView.setLayoutParams(params);


                }

Hinweis: Die params.width = ... muss ebenfalls gesetzt werden ...

Das obige Beispiel ist, wenn Sie TableRow und ListView in TableRow verwenden.

inhalt in lineares Layout umschließen

in der Listenansicht hinzufügen: Android: layout_weight = "1"

stellen Sie in Ihrem Button eine feste Höhe ein

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
              Android:layout_width="match_parent"
              Android:layout_height="wrap_content"
              Android:orientation="vertical">

<ListView
    Android:id="@+id/my_list"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_weight="1">
</ListView>

 <Button
    Android:text="Button"
    Android:layout_width="match_parent"
    Android:layout_height="50dp"/>

</LinearLayout>
0
Toma

Wenn Sie möchten, dass der Inhalt unter der Listenansicht nach unten verschoben wird, wenn der Liste Elemente hinzugefügt werden, versuchen Sie diese Lösung:

Fügen Sie am unteren Rand der Listenansicht eine positive Auffüllung und oben in der Fußzeile eine negative Auffüllung hinzu. Dies funktioniert in einem linearen Layout oder in einem relativen Layout.

<ListView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:paddingBottom="50dp"/>

<TextView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_marginTop="-50dp"/>
0