Hauteur limite de ListView sur Android

je veux montrer un bouton sous un ListView . Le problème est, si le ListView est étendu (é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 il n'y a pas de maxHeight pour une vue? ), mais soit j'ai mal pesé, soit ça n'a pas marché.

aussi, j'ai trouvé quelque part l'indication d'utiliser un RelativeLayout . Le ListView alors définies, au-dessus du bouton avec le android:layout_above param.

le problème avec ceci est que je ne sais pas comment positionner le bouton après. Dans l'exemple que j'ai trouvé, la vue au-dessous du ListView a été ajustée en utilisant android:layout_alignParentBottom , mais je ne veux pas que mon bouton s'accroche au bas de l'écran.

des idées en dehors de l'utilisation de la méthode sethight et un certain calcul de l'espace requis?


Edit: j'ai eu beaucoup de réponses utiles.

  • la nation crie de bigstone et user639183 la solution presque a parfaitement fonctionné. Cependant, j'ai dû ajouter un rembourrage/marge supplémentaire au bas du bouton, car il serait encore poussé à mi-chemin de l'écran (mais puis arrêté)

  • la réponse D'Adinia avec la disposition relative seulement est très bien si vous voulez la bouton fixe à la partie inférieure de l'écran. Ce n'est pas ce que je voulais, mais ça pourrait être utile à d'autres.

  • la solution D'AngeloS était celle que j'ai choisie à la fin car elle vient de créer les effets que je voulais. Cependant, j'ai fait deux changements mineurs au LinearLayout autour du bouton:

    • tout D'abord, comme je ne voulais pas avoir de valeurs absolues dans ma disposition , j'ai changé android:layout_height="45px" en wrap_content , qui fonctionne très bien ainsi.

    • Deuxièmement, comme je voulais que le bouton soit centré horizontalement, qui est seulement soutenu par vertical LinearLayout , j'ai changé android:orientation=" horizontal "à"vertical".

    AngeloS a également déclaré dans son premier post qu'il n'était pas sûr si le android:layout_weight="0.1" param dans le LinearLayout autour du ListView avait tout effet; je viens d'essayer et il fait réellement! Sans, le bouton est poussé hors de l'écran à nouveau.

85
demandé sur ROMANIA_engineer 2011-03-30 18:17:15

16 réponses

j'ai eu ce problème précis et pour le résoudre j'ai créé deux distincts LinearLayouts pour loger les ListView et Button respectivement. De là, j'ai mis les deux dans un autre Linear Layout et j'ai placé le conteneur android:orientation à vertical . J'ai également fixé le poids du LinearLayout qui abritait le ListView à 0.1 mais je ne sais pas si cela a un effet. De là, vous pouvez régler la hauteur du récipient inférieur (qui a votre bouton) à n'importe quelle hauteur vous tiens.

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 fixera le bouton le bas de l'écran.


pour faire flotter le bouton en bas de la liste, changer la hauteur de ListView01 en 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>
49
répondu AngeloS 2014-06-18 10:26:52

j'ai résolu ce problème dans le code, la hauteur de réglage de listview seulement si elle a plus de 5 éléments en elle:

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

notez que j'ai réglé la hauteur maximale à 5,5 fois la hauteur d'un seul article, de sorte que l'utilisateur saura à coup sûr qu'il y a du défilement à faire! :)

61
répondu shaylh 2012-04-10 07:31:59

sur votre dernière édition, vous avez juste à ajouter android:layout_above="@+id/butt1" dans votre code ListView.

et pour vous montrer (et à tous ceux qui ont essayé de répondre 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:

enter image description here

21
répondu Adinia 2011-03-31 07:18:25

en utilisant LinearLayout , réglez la hauteur de votre ListView et Button à wrap_content et ajoutez un poids=1 à ListView . Cela devrait fonctionner comme vous le souhaitez.

Et oui, mettez le layout_gravity du Button à bottom

6
répondu ernazm 2011-03-30 14:24:31

RelativeLayout est une solution, si vous ne voulez pas que le bouton reste trop près du fond, vous pouvez ajouter des marges (le rembourrage d'un bouton le briserait parce qu'il utilise un 9-patch arrière-plan, et il met son propre rembourrage).

ce serait la même chose si vous utilisiez un LinearLayout : la façon d'obtenir ce que vous voulez est de mettre le ListView à une hauteur=0 et poids=1, et pour le bouton hauteur=wrap_content et Poids=0. (configuration de wrap_content, as user639183 dit, ne serait pas limiter "151920920 'S Hauteur).

5
répondu bigstones 2011-03-30 14:55:16

a trouvé un moyen de le faire sans utiliser de récipients emboîtés, inspirés de la solution D'AngeloS.

j'ai utilisé un LinearLayout avec une orientation verticale, qui a un ListView et un bouton. J'ai mis le android:layout_weight="0.1" pour le ListView .

il réussit à obtenir le bâton de bouton au bas de la liste toujours. Et le bouton ne sort pas de l'écran lorsque la liste s'allonge.

<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
répondu Sparkle 2014-02-10 08:25:34

vous pouvez probablement faire ce travail en utilisant des conteneurs emboîtés. Il est possible que vous ayez besoin d'envelopper le bouton dans un deuxième conteneur (intérieur) de sorte qu'il prenne plus d'espace, et simplement aligner le bouton sur le dessus du conteneur intérieur.

Possible quelque chose comme ceci:

RelativeLayout

-- ListView

-- RelativeLayout

- - - - bouton

En utilisant les différentes options d'alignement sur les deux conteneurs, vous devriez être en mesure de faire fonctionner cela.

2
répondu Rich 2011-03-30 14:30:24

C'est la façon la plus propre de le faire:

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

il est similaire à la solution D'Angelos, mais vous n'avez pas besoin de la sortie en ligne qui termine le ListView. Vous pouvez également utiliser un FrameLayout qui est plus léger comparer à un LinearLayout pour envelopper le Bouton.

2
répondu user2994360 2013-11-15 00:16:21

l'idée est esquissée dans les très bonnes solutions par:

ils semblent tous deux fonctionner parfaitement au moins sur v4.4.3.

j'ai encore eu à passer un certain temps à écrire le code de test pour vérifier et confirmer chaque méthode. Vous trouverez ci-dessous le code de test minimal requis.


est basé sur la solution de Sparkle, car il contient moins de disposition imbriquée. Il a également été mis à jour pour tenir compte des vérifications actuelles des peluches.

<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>
L'activité

fournit le code pour tester la solution pour vous-même.

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

N'hésitez pas à ajouter ou à améliorer car il s'agit du"wiki communautaire".

2
répondu Richard Le Mesurier 2017-05-23 12:03:05

essayez D'utiliser RelativeLayout avec le bouton en bas. Réglez la hauteur de la mise en page comme "wrap_content". Je n'ai pas essayé. Juste à l'idée de

1
répondu Maxim 2011-03-30 14:25:09

dans LinearLayout, il suffit d'ajouter android:layout_weight="1" à votre ListView

1
répondu DawnYu 2015-09-19 06:58:51

ce qui suit est ce qui a fonctionné pour moi...

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


                }

Remarque : Les paramètres.largeur.= .. Doit également être réglés...

l'exemple ci-dessus est lorsque vous utilisez TableRow et ListView à L'intérieur de TableRow...

0
répondu Atul Dravid - White Pvt. Ltd. 2013-12-25 12:03:12

wrap contenu dans les linéaires de la forme

dans la vue Liste Ajouter: android: layout_weight=" 1 "

dans votre jeu de boutons hauteur fixe

<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
répondu Toma 2015-04-15 11:15:22

si vous voulez que le contenu sous la vue liste soit déplacé vers le bas au fur et à mesure que des éléments sont ajoutés à la liste, essayez cette solution:

ajouter du rembourrage positif en bas de la liste et du rembourrage négatif en haut du "pied de page". Cela fonctionnera dans un plan linéaire ou un plan relatif.

<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
répondu Jenny Pushkarskaya 2016-11-22 06:28:04

Puisqu'il n'y a pas D'attribut MaxHeight, votre meilleure option est soit de définir la hauteur du ListView à une valeur définie, soit d'utiliser wrap_content .

-1
répondu Chris Cashwell 2011-03-30 14:29:05

j'ai résolu ce problème en plaçant ListView dans un ScrollView. Lint n'a pas aimé, mais en ajoutant une minHeight et en mettant le fillViewport à true, j'ai un bon résultat.

    <ScrollView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="1dp"
        android:layout_marginRight="1dp"
        android:minHeight="100dp"
        android:fillViewport="true"
        android:fadeScrollbars="false"
        android:paddingTop="2dp" 
        android:orientation="vertical"
        android:scrollbarAlwaysDrawVerticalTrack="true" >

        <ListView
            android:id="@+id/workoutAElistRoutines"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="fill_vertical"
            android:background="@drawable/dialog_inner_border_tan"
            android:choiceMode="singleChoice"
            android:orientation="vertical"
            android:paddingLeft="3dp"
            android:paddingRight="3dp" >

        </ListView>
    </ScrollView>        
-2
répondu Jon 2012-06-02 15:24:10