Android ListView Footer View не помещается в нижней части экрана

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

Например, у меня есть страница с ListView из трех элементов и FooterView (с помощью ListView addFooterView), я хочу, чтобы этот 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>

Java

    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 патчами)
  • Добавление cone_footer в виде отдельного представления в макете

Спасибо заранее!

Ответы

Ответ 1

В случае, если другие ищут аналогичный ответ, вот что я сделал, чтобы решить вопрос, который у меня был. Поскольку "Нижний колонтитул", который я хотел добавить, был просто образным, чтобы заполнить какое-то пространство на экране (поскольку, когда представления были короткими), а подход 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>

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

Ответ 2

Я хочу, чтобы footerView сидел на нижней части экрана.

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

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

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

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

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

Ответ 3

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

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

Ответ 4

Аналогично

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

Ответ 5

Вот трюк, который я использовал для достижения такого поведения.

в основном вы устанавливаете 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>