在ListView下获取视图,但不在屏幕底部

时间:2015-12-07 10:53:16

标签: android layout

尝试以我想要的方式获得布局。它包含一个ListView和一个包含两个TextView的LinearLayout。

问题是如果ListView有更多项目然后放在一个屏幕上,则ListView会占用整个屏幕。在这种情况下,它不会在其下方显示视图。

如果我使用layout_height = 0dp将ListView设置为layout_weight = 1,则其下方的View将一直显示到底部,因为如果没有足够的项目,ListView将填满屏幕。

那么如何直接在其下方获取带有View的ListView,所以不将其设置在屏幕的底部?

根据要求(但如果列表视图不适合一个屏幕,则无法查看列表视图下方的视图):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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">

    <ListView
        android:id="@+id/list_bookings"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" />

    <LinearLayout
        android:id="@+id/expected_cost_linearLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/padding_regular">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:focusable="false"
            android:text="@string/expected_cost_label"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/expected_cost_textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="..."
            android:focusable="false" />
    </LinearLayout>

</LinearLayout>

2 个答案:

答案 0 :(得分:1)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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">

    <ListView
        android:id="@+id/list_bookings"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorPrimaryDark"
        android:layout_gravity="center_horizontal"
        android:layout_marginBottom="50dp" />

    <LinearLayout
        android:id="@+id/expected_cost_linearLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:focusable="false"
            android:text="expected_cost_label"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/expected_cost_textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="..."
            android:focusable="false" />
    </LinearLayout>

</RelativeLayout>

更新的答案

使用此布局文件

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    xmlns:android="http://schemas.android.com/apk/res/android" >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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">

    <ListView
        android:id="@+id/list_bookings"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimaryDark"
        android:layout_gravity="center_horizontal"
         />

    <LinearLayout
        android:id="@+id/expected_cost_linearLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:focusable="false"
            android:text="expected_cost_label"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/expected_cost_textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="..."
            android:focusable="false" />
    </LinearLayout>

</LinearLayout>
    </ScrollView>

//在你的布局文件中 将适配器设置为listview后调用此方法。此代码取自 https://stackoverflow.com/a/19311197/2793134

public static void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null)
            return;

        int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.UNSPECIFIED);
        int totalHeight = 0;
        View view = null;
        for (int i = 0; i < listAdapter.getCount(); i++) {
            view = listAdapter.getView(i, view, listView);
            if (i == 0)
                view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, AbsListView.LayoutParams.WRAP_CONTENT));

            view.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
            totalHeight += view.getMeasuredHeight();
        }
        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
    }

希望这会有所帮助。干杯

答案 1 :(得分:0)

我觉得太复杂了。我最终创建了一个ListItem,可以使用我想要的布局进入适配器。这样它就成了ListView的一部分,它的位置可以控制在底部。因为它是ListView的一部分所以它不会被ListView混淆,就像ListView在物品太多时获得的视图一样。