arielnmz
arielnmz

Reputation: 9125

Android View to fill center area of Layout

I have this layout:

Activity's layout

All views fill the entire space horizontally, and they're inside a LinearLayout oriented vertically. The blue parts have a fixed height (they have the wrap_content property).

The red part is a ListView. How can I make it fill that center space if there are not enough elements in the list and at the same time preventing it to push the last two elements down if it has more elements?

So far it doesn't push down the two views under it (with the layout_weight="1" property), but if it doesn't have enough elements, it shrinks and makes those two elements go up, leaving an ugly white space under them.

This is what happens:

What i've got

This is what I expect:

Expected result

Notice that even though the ListView is smaller, the two last views don't go up.

So far I've tried:

What may work

I've been messing around and I think a RelativeLayout may work, with a property like layout_alignBottom that instead of aligning to the end of the given view, it aligned to the start of it.

SOLUTION

The solution was to use a RelativeLayout and set the list's layout_above and layout_below properties to that of the elements I want to align it to.

Upvotes: 1

Views: 560

Answers (3)

antslava
antslava

Reputation: 346

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.stackoverflow.app.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="48dp"
        android:text="@string/hello_world" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="48dp"
        android:text="@string/hello_world" />

</LinearLayout>

Upvotes: 3

Dave S
Dave S

Reputation: 3468

Here's a couple of options that may work for you. Let me know how it goes.

Option 1: Set the containing vertical orientated linear layout to fill_parent / match_parent (they are the same). Then set the gravity or layout gravity of the bottom 2 views to bottom.

Option 2: Contain the list view in a linear layout with a fixed height. Set the list view to wrap_content.

EDIT

You could use relative layouts for this, this link here seems to do what you need http://www.javacodegeeks.com/2013/10/android-fixed-header-and-footer-with-scrollable-content-layout-example.html

Upvotes: 1

Shan Markus
Shan Markus

Reputation: 127

How about wrapping your list view inside the a layout and give the layout the fixed height.

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="300dp" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</RelativeLayout>

Upvotes: 1

Related Questions