【问题标题】:How to limit the height of a ListView within a GridLayout?如何限制 GridLayout 中 ListView 的高度?
【发布时间】:2014-12-03 11:37:21
【问题描述】:

我有一个GridLayout,其中包含一个ListView 和一个TextView。添加项目时 到ListView,它会变大并将其下方的TextView 推出 屏幕。我认为通过在 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>

【问题讨论】:

  • 我理解你的问题,你希望你的 ListView 是一个静态高度并且可以单独滚动吗?如在 ListView 中滚动时,GridView 的其余部分不会滚动。
  • 是的,ListView 应该占用所有可用空间。它也应该是可滚动的,但 GridView 不应该滚动,并且 ListView 下方的 TextView 应该始终可见。
  • 你不能简单地通过直接使用 GridLayout 来做你想做的事。甚至文档也指出该小部件不支持重量的概念,并建议将子组件包装在 LinearLayout 中。
  • 来自here: "GridLayout 不提供对权重原则的支持。因此一般情况下无法配置它来在多个组件之间分配多余的空间。一些常见的使用-cases 仍可按如下方式进行调整。要在单元组中的组件周围放置等量的空间;使用 CENTER 对齐(或重力)。要完全控制行或列中的多余空间分布;使用 LinearLayout 子视图来保存相关单元组中的组件..."
  • 因此,由于 ListView's 高度不是固定的并且会随着新内容的扩展而扩展,除非您使用 @,否则您无法通过 xml 属性实现所需的行为987654333@ 带重量或 RelativeLayout 作为 ListViewTextView 的包装器。

标签: android android-layout android-gridlayout


【解决方案1】:

您可以限制 ListView 的大小并将包装内容作为高度的唯一方法是扩展类,覆盖 onMeasure 方法并在那里设置您的高度限制。我不知道有任何 xml 参数会给你想要的效果。

【讨论】:

  • ListView 在哪里/如何设置为“wrap_content”?
  • 嗯,你是对的,它没有用 GridLayout 子级定义,但从你的描述来看,它看起来就像它的行为一样(我自己没有尝试过)。但我的建议仍然有效。 GridView 会将您发送到可用空间的 onMeasure 方法大小。如果将此值与 setMeasuredDimensions 一起使用。您应该受到可用空间的限制。
  • 这就像 Onik 在他的评论中所说,但如果你想避免包装布局,你可以使用我的建议。原则上你明白还是我应该给你一些代码?
  • 我正在寻找 XML 解决方案或解释为什么不能单独使用 XML 来完成。
【解决方案2】:

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

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

但是,我想不出一种方法来使这种规模适用于多种设备。

【讨论】:

    【解决方案3】:

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

    向框架添加 GridLayout 可以解决有关嵌套布局的一系列缺点,其中一个是 "inability to control alignment along both horizontal and vertical axes simultaneously",如文章 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 em>,一旦视图占据了屏幕的整个高度(如 ListView 在您的情况下),如果布局方向设置为 @,则其下方的视图将位于屏幕后面987654337@.

    如果我们查看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>
    

    【讨论】:

      【解决方案4】:

      如果需要,可以将 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>
      

      【讨论】:

        猜你喜欢
        • 2011-07-26
        • 2017-06-10
        • 1970-01-01
        • 2013-11-20
        • 1970-01-01
        • 1970-01-01
        • 2012-08-27
        • 1970-01-01
        • 2016-04-28
        相关资源
        最近更新 更多