Предельная высота ListView на Android - PullRequest
86 голосов
/ 30 марта 2011

Я хочу показать кнопку под ListView. Проблема в том, что если ListView будет расширен (элементы добавлены ...), кнопка будет выдвинута за пределы экрана.

Я пробовал LinearLayout с весами (как предложено в Android: почему нет maxHeight для View? ), но либо я неправильно понял вес, либо он просто не работал.

Также я нашел где-то подсказку, чтобы использовать RelativeLayout. ListView будет затем установлен над кнопкой с параметром android:layout_above.

Проблема в том, что я не знаю, как потом расположить кнопку. В найденном мной примере вид под ListView был настроен с помощью android:layout_alignParentBottom, но я не хочу, чтобы моя кнопка цеплялась за нижнюю часть экрана.

Есть ли какие-либо идеи, кроме использования метода setHeight и некоторого вычисления требуемого пространства?


Edit: Я получил много полезных ответов.

  • bigstone & user639183 почти работало отлично. Тем не менее, мне пришлось добавить дополнительный отступ / отступ к нижней части кнопки, так как он все еще будет выталкиваться на полпути из экрана (но затем останавливаться)

  • Ответ Adinia с относительной разметкой подходит только для кнопки, закрепленной в нижней части экрана. Это не то, что я намеревался, но все же может быть полезно для других.

  • Решение AngeloS было тем, которое я выбрал в конце, поскольку оно только создавало эффекты, которые я хотел. Однако я сделал два небольших изменения в LinearLayout вокруг кнопки:

    • Во-первых, поскольку я не хотел, чтобы в моем макете были абсолютные значения, я изменил android:layout_height="45px" на wrap_content, что также прекрасно работает.

    • Во-вторых, так как я хотел, чтобы кнопка располагалась по центру по горизонтали, что поддерживается только по вертикали LinearLayout, я изменил Android: ориентация = "горизонтальная" на "вертикальная".

    AngeloS также заявил в своем первоначальном посте, что он не был уверен, имел ли какой-либо параметр android:layout_weight="0.1" в LinearLayout вокруг ListView какое-либо влияние; Я только попробовал, и это действительно делает! Без этого кнопка снова выходит за пределы экрана.

Ответы [ 16 ]

1 голос
/ 30 марта 2011

Попробуйте использовать RelativeLayout с кнопкой внизу.Установите высоту макета как «wrap_content».Я не пробовал это.Просто идея

0 голосов
/ 22 ноября 2016

Если вы хотите, чтобы содержимое под списком перемещалось вниз при добавлении элементов в список, попробуйте следующее решение:

Добавьте положительный отступ к нижней части списка и отрицательный отступ к верху нижнего колонтитула. Это будет работать в линейном или относительном макете.

<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 голосов
/ 15 апреля 2015

Завершение содержимого в линейный макет

в виде списка добавить: Android: layout_weight = "1"

в вашей кнопке установлена ​​фиксированная высота

<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 голосов
/ 25 декабря 2013

Вот что у меня сработало ...

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


                }

Примечание. Параметр params.width = ... также необходимо установить ...

Приведенный выше пример - когда вы используете TableRow и ListView внутри TableRow ...

0 голосов
/ 02 июня 2012

Я решил это, поместив ListView внутри ScrollView. Lint это не понравилось, но, добавив minHeight и установив fillViewport в true, я получил хороший результат.

    <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>        
0 голосов
/ 30 марта 2011

Поскольку атрибут MaxHeight отсутствует, лучше всего либо установить высоту ListView на заданное значение, либо использовать wrap_content.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...