如何在GridLayout中限制ListView的高度?

时间:2014-10-08 17:46:55

标签: android android-layout android-gridlayout

我的GridLayout包含ListViewTextView。添加项目时 到ListView它会变大,并将其下面的TextView推出。{1}} 屏幕。我认为通过在ListView上设置layout_gravity="fill"它 根本不会增长,而是占用所有可用空间。

如何配置ListView占用可用空间而不是 在屏幕下方增长并推动视图?

我正在寻找使用GridLayout的解决方案。我知道在我的情况下 LinearLayout也会起作用。然而,这只是一个最小的测试用例 说明我的问题。

如果可能的话,我不想以编程方式设置高度。

<android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:columnCount="1"
    app:useDefaultMargins="true" >

    <ListView
        app:layout_gravity="fill" />

    <TextView
        android:text="TextView" />

</android.support.v7.widget.GridLayout>

5 个答案:

答案 0 :(得分:6)

此答案将我的评论扩展到问题并试图解释 why this cannot be done with XML via GridLayout's attributes

GridLayout 添加到框架允许解决有关嵌套布局的一系列缺点,其中一个是 "inability to control alignment along both horizontal and vertical axes simultaneously" ,正如本文所述Philip Milne New Layout Widgets: Space and GridLayout

此对齐控件由 layout_gravity 参数执行,其description表示参数 "specifies how a component should be placed in its group of cells", NOT within a root layout )。基本上,它与 LinearLayout 的内容相同,后者在文章中也提到过: "Alignment/gravity also works just like gravity in LinearLayout..." 正如我们所知, LinearLayouts ,一旦视图占据了整个屏幕的高度(例如 ListView ),下面的视图就会落后于如果布局方位设置为 "vertical" ,则显示屏幕。

如果我们查看GridLayout.LayoutParams文档,我们就不会找到任何允许单元格组中的组件粘贴到父布局的某个位置并保持在与该布局无关的位置的参数。同一组内其他组件的大小;类似于RelativeLayout的layout_align[...]参数。

我对 GridLayout 中缺少此类参数的最佳猜测是,与嵌套布局相比,更好的对齐控制。

我确定您使用 GridLayout's 属性以外的方法了解问题的解决方案。我只是建议一个让答案看起来完成:

<GridLayout
    ... >

    <RelativeLayout
       ... >

        <TextView
            ...
            android:id="@+id/tv"
            android:layout_alignParentBottom="true" />

        <ListView
            ...
            android:layout_above="@id/tv">
         </ListView>

    </RelativeLayout>

</GridLayout>

答案 1 :(得分:1)

您可以按以下方式以编程方式设置ListView的高度:

ListView listView = (ListView) findViewById(R.id.listview);
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) listView.getLayoutParams();
layoutParams.height = listHeight;
listView.setLayoutParams(layoutParams);
listView.setAdapter(listAdapter);

然而,我无法想到一种方法可以很好地为多个设备提供这种规模。

答案 2 :(得分:0)

只有这样才能限制ListView的大小,并将换行内容作为高度,扩展类,重写onMeasure方法并设置高度限制。我不知道任何xml params会给你想要的效果。

答案 3 :(得分:0)

如果需要,可以在页脚中设置TextView,然后ListView不会推送它。尽管我不确定这是不是你想要的

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<!-- Footer aligned to bottom -->

<RelativeLayout
    android:id="@+id/footer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:background="@drawable/background"
    android:gravity="center" >

    <!-- TextView Here -->

</RelativeLayout>

<!-- Content below header and above footer -->

<RelativeLayout
    android:id="@+id/content"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_above="@id/footer"
    android:gravity="center" >

    <!-- ListView Here -->

</RelativeLayout>
</GridLayout>

答案 4 :(得分:-2)

您应该使用其他布局作为ListViewTextView的父级,并根据需要定位它们。

<android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:columnCount="1"
    app:useDefaultMargins="true" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <ListView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_above="@+id/text_view_id" />

        <TextView
            android:id="@+id/text_view_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:text="TextView" />

    </RelativeLayout>

</android.support.v7.widget.GridLayout>