Представление нижнего колонтитула Android ListView не помещается в нижнюю часть экрана

Я уверен, что мне не хватает чего-то простого, чтобы реализовать это, но я пробежался по каждой известной комбинации, которую могу придумать, чтобы получить то, что я хочу сделать, работающим. Я пытаюсь разместить нижний колонтитул ListView внизу экрана, когда элементы ListView не заполняют страницу.

Например, у меня есть страница с ListView из трех элементов и FooterView (используя addFooterView ListView). Я хочу, чтобы этот footerView располагался внизу экрана. Когда ListView содержит достаточно элементов для прокрутки экрана, footerView должен располагаться в конце списка (а не в нижней части экрана).

XML, который я пытаюсь использовать, приведен ниже. Любая помощь очень ценится!

Layout.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@+drawable/background">
<ListView
    android:id="@+id/menu" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:listSelector="@android:color/transparent"
    android:divider="@null">
</ListView></RelativeLayout>

ListViewRow.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
style="@style/Nationwide.menu">
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/nav_item"
    style="@style/Nationwide.menu.row">
    <ImageView 
        android:id="@+id/image_icon"
        style="@style/Nationwide.menu.leftIcon" />
    <TextView 
        android:id="@+id/nav_text" 
        style="@style/Nationwide.menu.text" />
    <ImageView
        android:id="@+id/chevron_symbol"
        style="@style/Nationwide.menu.rightIcon" />
</LinearLayout>
<View
    android:layout_height="1dp"
    android:background="@drawable/nav_item_divider_dark" />
<View
    android:layout_height="1dp"
    android:background="@drawable/nav_item_divider_light" /></LinearLayout>

ListViewFooter.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/footer"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentBottom="true">
<View 
    android:id="@+id/footer_image"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentBottom="true" /></RelativeLayout>

Джава

    LayoutInflater inflater = this.getLayoutInflater();
    View footerView = inflater.inflate(R.layout.footer, null);

    footerView.findViewById(R.id.footer_image).setBackgroundDrawable(resources.getDrawable(R.drawable.cone_footer));

    mMenuListView.addFooterView(footerView);

То, что я пробовал до сих пор, включает:

  • Добавление представления нижнего колонтитула, как показано выше
  • Добавление вытягиваемого ресурса в качестве фона в ListView (это привело к тому, что ListView не охватывал всю ширину экрана и прокручивался странным образом из-за растягиваемых областей 9-Patch)
  • Добавление cone_footer в качестве отдельного представления в макете

Заранее спасибо!


person George Walters II    schedule 22.06.2010    source источник
comment
Прошу прощения, но я не добавил достаточно кода Java. После добавления footerView в listView этот код запускается. mMenuListView.setAdapter (панель);   -  person George Walters II    schedule 22.06.2010


Ответы (5)


Я хочу, чтобы этот footerView располагался внизу экрана.

Это не то, как addFooterView() работает.

Когда ListView содержит достаточно элементов для прокрутки экрана, footerView должен располагаться в конце списка (а не в нижней части экрана).

Это тоже не то, как addFooterView() работает.

Если вы хотите, чтобы он прокручивался вместе со списком (например, если три элемента списка занимают верхнюю половину экрана, нижний колонтитул находится прямо под тремя элементами), используйте _3 _..., но тогда нижний колонтитул всегда прокручивается с список.

Если вы хотите, чтобы он не прокручивался вместе со списком, один из подходов - использовать RelativeLayout в качестве родителя, привязать нижний колонтитул к нижней части экрана и разместить ListView между верхним и нижним колонтитулами ... но тогда нижний колонтитул никогда не прокручивается.

person CommonsWare    schedule 22.06.2010
comment
Ах, значит, нет способа привязать представление условно к нижней части экрана, если содержимое не заполняет экран и не прокручивается в противном случае? Вернемся к дизайнерам ... Потрясающе. Спасибо за ответ. - person George Walters II; 22.06.2010
comment
Теперь, когда я перечитал это снова, я, должно быть, не понял, чего хотят дизайнеры. Они хотят, чтобы нижний колонтитул прокручивался вместе с этим списком с предостережением: если список (включая нижний колонтитул) меньше экрана, принудительно выровняйте нижний колонтитул по нижней части экрана. В противном случае просто покажите его после последней строки listView. - person George Walters II; 22.06.2010
comment
@ Джордж Уолтерс II: В Android нет ничего, что могло бы просто добиться этого. Как предполагает Тлейтон, может быть способ добиться подобного внешнего вида, но с большими трудностями и, возможно, за счет UX (например, больше не доступен для навигации с помощью D-Pad). - person CommonsWare; 22.06.2010
comment
Как сделать это для навигационного ящика? - person Akshay; 20.06.2016

Если другие ищут аналогичный ответ, вот что я сделал, чтобы решить возникшую у меня проблему. Поскольку «Нижний колонтитул», который я хотел добавить, был просто изображением, заполняющим некоторое пространство на экране (для случаев, когда представления были короткими), а подход ListView на самом деле был не тем, что мне нужно для моей реализации, мы закончили с этим как наш XML-макет:

    <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res/com.example.android.apis"
    style="@style/company.mainContainer">

    <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical">
        <!-- enter page content here -->

        <View android:layout_height="0px" android:layout_weight="1"
            android:visibility="invisible" />

        <ImageView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|right"
            android:scaleType="fitXY"
            android:src="@drawable/footer_cone">
        </ImageView>

    </LinearLayout>

</ScrollView>

Надеюсь, это поможет другим!

person George Walters II    schedule 26.07.2010

То, что вы пытаетесь сделать, на самом деле довольно сложно. Вы хотите, чтобы «нижний колонтитул» прокручивался вместе со списком (по крайней мере, иногда), а это значит, что он должен содержаться в макете ListView. Но тогда вы также (в других случаях) хотите, чтобы тот же нижний колонтитул был размещен относительно экрана или, точнее, относительно некоторого родительского макета (или родительского-родительского и т. Д.) ListView, что означает, что нижний колонтитул не должен содержаться в ListView. Эти два сценария требуют взаимоисключающего размещения рассматриваемого элемента.

Однако со стороны SDK это неплохой дизайн. Судя по вашему описанию, вы могли неправильно подумать о проблеме. Является ли этот элемент действительно нижним колонтитулом, концептуально говоря, если он не всегда находится в конце списка, а иногда полностью внизу экрана? Вы МОЖЕТЕ получить нужный макет, объединив ListViews, ScrollViews, RelativeLayouts и некоторые хитрости android: layout_height. Однако может быть лучше просто применить альтернативный подход к дизайну.

person tlayton    schedule 22.06.2010
comment
Что ж, семантически это должен быть нижний колонтитул списка, что, как я думаю, мне нужно сделать, это динамически добавить в представление перед этим нижним колонтитулом, чтобы разместить соответствующее количество места для размещения изображения там, где мы хотим. - person George Walters II; 22.06.2010
comment
привет, мне нужна помощь в настройке нижнего колонтитула в моем представлении списка и в расширении списка, когда я нажимаю событие из нижнего колонтитула, позвольте мне сделать то же самое, пожалуйста, покажите мне пошаговый процесс. - person MGSenthil; 02.09.2010

Так же, как это

<RelativeLayout>
    <include android:id="@+id/header" layout="@layout/header" android:layout_width="fill_parent" android:layout_alignParentTop="true" />

    <include android:id="@+id/footer" layout="@layout/footer" android:layout_width="fill_parent" android:layout_alignParentBottom="true" /> 

    <ListView android:layout_below="@id/header" android:layout_above="@id/footer"/> 
</RelativeLayout>
person Parag Chauhan    schedule 15.04.2012

вот уловка с разницей, которую я использовал, чтобы добиться такого поведения.

в основном вы устанавливаете ListView на wrap_content, а Button помещаете в ListView нижнее поле поля, используя отрицательное поле.

здесь используется фиксированная высота, но вы также можете измерить кнопку во время выполнения и динамически установить положительное и отрицательное поле.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<ListView
    android:id="@+id/list_item"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="50dp"
    android:layout_alignParentTop="true" />

<Button
    android:layout_width="fill_parent"
    android:layout_height="50dp"
    android:layout_below="@+id/list_item"
    android:paddingBottom="@dimen/margin"
    android:layout_topMargin="-50dp"
    android:paddingTop="@dimen/margin"
    android:text="@string/add" />

</RelativeLayout>
person Mario Lenci    schedule 07.01.2014