Android ListView Footer View не размещается в нижней части экрана - PullRequest
15 голосов
/ 22 июня 2010

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

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

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

Ответы [ 5 ]

16 голосов
/ 22 июня 2010

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

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

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

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

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

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

3 голосов
/ 26 июля 2010

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

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

1 голос
/ 07 января 2014

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

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

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

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

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

<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>
1 голос
/ 22 июня 2010

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

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

...