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

Android 如何限制GridLayout中ListView的高度?,android,android-layout,android-gridlayout,Android,Android Layout,Android Gridlayout,我有一个GridLayout包含一个ListView和一个TextView。添加项目时 到列表视图时,它将增大大小,并将其下方的文本视图推出 屏幕。我认为通过在列表视图上设置layout\u gravity=“fill”,可以 根本不会增长,而是占用所有可用空间 如何配置列表视图以占用可用空间,而不是 增长并将其下方的视图移出屏幕 我正在寻找一个使用GridLayout的解决方案。我知道在我的情况下 LinearLayout也可以。然而,这只是一个最小的测试用例 举例说明我的问题 如果可能的话,

我有一个
GridLayout
包含一个
ListView
和一个
TextView
。添加项目时 到
列表视图
时,它将增大大小,并将其下方的
文本视图
推出 屏幕。我认为通过在列表视图上设置
layout\u gravity=“fill”
,可以 根本不会增长,而是占用所有可用空间

如何配置
列表视图
以占用可用空间,而不是 增长并将其下方的视图移出屏幕

我正在寻找一个使用
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>


限制将内容包装为高度的ListView大小的唯一方法是扩展类,重写onMeasure方法并在其中设置高度限制。我不知道任何xml参数whích会给您带来想要的效果。

您可以通过编程设置ListView的高度,如下所示:

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

但是,我想不出一种方法可以很好地对多个设备进行缩放。

这个答案将我的评论扩展到了这个问题,并试图解释为什么不能通过GridLayout的属性用XML来实现这一点

GridLayout
添加到框架中可以解决嵌套布局的一系列缺点,其中之一是
“无法同时控制沿水平轴和垂直轴的对齐”
,如Philip Milne在文章中所述

此对齐控制由
layout\u gravity
参数执行,该参数表示
参数“指定组件应如何放置在其单元格组中”
不在根布局中)。基本上,它与
LinearLayout
相同,这篇文章中也提到了:
“对齐/重力也与LinearLayout中的重力一样……”
我们知道,对于
LinearLayout
,一旦视图占据了屏幕的整个高度(如您的
ListView
),如果布局方向设置为“垂直”
,则其下方的视图位于屏幕后面

如果我们查看文档,我们将找不到任何参数,这些参数将允许单元组中的组件粘附在父布局的某个位置,并保持在与同一组中其他组件的大小无关的位置;类似于RelativeLayout的参数

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

我相信您知道使用
GridLayout的
属性以外的方法解决问题的方法。我只建议一个让答案看起来很有成就感的答案:

<GridLayout
    ... >

    <RelativeLayout
       ... >

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

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

    </RelativeLayout>

</GridLayout>

如果需要,可以在页脚中设置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>


为了让我理解您的问题,您希望您的ListView是一个静态高度,并且可以单独滚动吗?如中所示,当您在ListView中滚动时,GridView的其余部分将不会滚动。是的,ListView应占据所有可用空间。它也应该是可滚动的,但是GridView不应该滚动,ListView下面的TextView应该始终可见。你不能简单地直接使用GridLayout来做你想做的事情。即使是文档也表明该小部件不支持重量的概念,并建议将孩子们包装成线性布局。来源:“GridLayout不支持重量原则。因此,通常不可能将其配置为在多个组件之间分配多余的空间。然而,一些常见的用例可以如下所示。在单元组中的组件周围放置等量的空间;使用中心对齐(或重力)。用于完全控制行或列中的多余空间分布;使用LinearLayout子视图保存关联单元格组中的组件。。。“因此,由于
列表视图的高度不是固定的,并随着新内容扩展,因此除非使用带权重的
线性布局
相对长度
作为
列表视图
文本视图
的包装,否则无法通过xml属性实现所需的行为。列表视图在哪里/如何设置为“包装内容”?您是对的,它没有用GridLayout子项定义,但从您的描述来看,它的行为与以前一样(我自己还没有尝试过)。但我的建议仍然有效。GridView将向您发送可用空间大小的onMeasure方法。如果将此值与setMeasuredDimensions一起使用。你应该限制可用空间。这就像Onik在评论中说的,但如果你想避免包装器布局,你可以使用我的建议。您在原则上理解了吗?或者我应该为您提供一些代码吗?我正在寻找一个XML解决方案,或者解释为什么单用XML无法做到这一点。