93 votes

Limiter la hauteur de ListView sur Android

J'en veux pour preuve d'un bouton dans une ListView. Le problème est, si la liste est agrandi (éléments ajoutés...), le bouton est poussé hors de l'écran.

J'ai essayé un LinearLayout avec des poids (comme suggéré dans Android: pourquoi n'est-il pas maxHeight de Vue?), mais j'ai eu le poids de mal ou il n'a tout simplement pas de travail.

Aussi, j'avais trouvé l'astuce pour utiliser un RelativeLayout. La liste sera ensuite fixé au-dessus du bouton avec le "android:layout_above" param.

Problème c'est que je ne sais pas comment positionner le bouton par la suite. Dans l'exemple que j'ai trouvé, la Vue ci-dessous la liste a été ajusté à l'aide de "android:layout_alignParentBottom", mais je ne veux pas que mon bouton pour s'accrocher à la partie inférieure de l'écran.

Toute idée en dehors de l'aide setHeight-méthode et un peu de calcul de l'espace requis?

Merci pour votre temps, les méduses


Edit: J'ai eu beaucoup de réponses, merci à vous tous!

  • la nation crie de bigstone et user639183 la solution de presque parfaitement fonctionné. Cependant, j'ai dû ajouter un rembourrage supplémentaire/de la marge vers le bas du bouton, comme il serait encore poussé la moitié de sortir de l'écran (mais alors arrêté)

  • Adinia de réponse avec la mise en page seulement est parfait si vous souhaitez que le bouton fixe à la partie inférieure de l'écran. Ce n'est pas ce que j'ai prévu, mais encore il pourrait être utile pour d'autres personnes.

  • AngeloS la solution celui que j'ai choisi à la fin, qu'il vient de créer les effets que je voulais. Cependant, j'ai fait deux changements mineurs à la LinearLayout autour du bouton:

    • Tout d'abord, comme je ne veux pas avoir des valeurs absolues dans ma présentation, j'ai changé android:layout_height="45px" à "wrap_content", qui fonctionne très bien ainsi.

    • Ensuite, comme je voulais le bouton pour être centré horizontically, qui est uniquement pris en charge par la verticale LinearLayout, j'ai changé android:orientation="horizontal" à "vertical".

    AngeloS a également indiqué dans son post initial qu'il n'était pas sûr de le android:layout_weight="0.1" param dans le LinearLayout autour de la ListView eu aucun effet; j'ai juste essayé et en fait il ne! Sans, le bouton est poussé hors de l'écran à nouveau.

69voto

shaylh Points 688

J'ai résolu ce problème dans le code, en définissant height de listview uniquement s'il contient plus de 5 éléments:

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

Remarquez que je règle la hauteur maximale à 5,5 fois la hauteur d'un seul élément, afin que l'utilisateur sache qu'il doit faire défiler! :)

55voto

AngeloS Points 1555

J'ai eu exactement ce problème et pour le résoudre j'ai créé deux séparés LinearLayouts à la maison de l' ListView et Button respectivement. À partir de là j'ai mis dans un autre Linear Layout et définir conteneur android:orientation de vertical. J'ai également réglé le poids de l' LinearLayout qui abritait l' ListView de 0.1 mais je ne sais pas si cela a un quelconque effet. À partir de là, vous pouvez régler la hauteur de la partie inférieure du conteneur (qui a votre bouton) à toute hauteur que vous voulez.

EDIT c'est ce que je veux dire:

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

La solution ci-dessus va résoudre le bouton au bas de l'écran.


Pour avoir le bouton flotter au bas de la liste, modifier la hauteur de l' ListView01 de wrap_content:

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

21voto

Adinia Points 2837

Lors de votre dernière modification, il vous suffit d'ajouter également android:layout_above="@+id/butt1" dans votre code ListView.

Et pour vous montrer (et à tous ceux qui ont déjà essayé une réponse plus tôt) que vous n'avez vraiment pas besoin d'utiliser plus d'un RelativeLayout , voici votre code corrigé :

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

et le résultat , en utilisant une liste aléatoire:
entrez la description de l'image ici

6voto

ernazm Points 5289

En utilisant LinearLayout , définissez la hauteur de votre ListView et Button à wrap_content et ajoutez un poids = 1 à ListView . Cela devrait fonctionner comme vous voulez.
Et oui, réglez les layout_gravity des Button sur bottom

5voto

bigstones Points 9636

RelativeLayout est une solution, si vous ne voulez pas le bouton de rester trop près de la base, vous pouvez ajouter des marges (remplissage d'un bouton pause parce qu'il utilise un 9-patch arrière-plan, et il établit ses propres rembourrage).

Il en serait de même si vous avez utilisé un LinearLayout: la façon d'obtenir ce que vous voulez, c'est de définir l' ListView pour une hauteur=0 et poids=1, et pour le bouton height=wrap_content et de poids=0. (paramètre à la fois pour wrap_content, comme user639183 dit, ne serait pas de limite de ListViews'hauteur).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X