2014-10-08 77 views
3

我有一个GridLayout包含ListViewTextView。当物品 增加到ListView时,它会变大,并将TextView推下 屏幕。我认为通过在ListView上设置layout_gravity="fill"它不会增长,而是占用所有可用空间。如何限制GridLayout中ListView的高度?

如何配置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> 
+0

就这样,我明白你的问题,你希望你的ListView是一个静态高度和单独滚动?就像在ListView中滚动时一样,GridView的其余部分也不会滚动。 – 2014-10-14 13:33:01

+0

是的,ListView应该占用所有可用空间。它也应该是可滚动的,但是GridView不应该滚动并且ListView下面的TextView应该始终可见。 – 2014-10-14 13:43:07

+0

你不能直接使用GridLayout来做你想做的事。甚至文档都指出这个小部件不支持重量的概念,并建议将这些孩子包裹在LinearLayout中。 – Luksprog 2014-10-14 14:05:42

回答

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 placedin 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> 
-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> 
+0

我明确要求使用GridLayout解决方案。我也说过,我知道LinearLayout。你的建议与LinearLayout有什么不同?为什么RelativeLayout应该可以工作,但GridLayout没有? – 2014-10-08 18:09:42

0

只有这样,你可以限制的ListView的大小与包装内容高度,是延长类,覆盖onMeasure方法,有设置你的限制高度。我不知道任何xml参数会给你想要的效果。

+0

ListView在哪里/如何设置为“wrap_content”? – 2014-10-14 13:52:04

+0

你说得对,它没有用GridLayout子进行定义,但是从你的描述来看,它看起来像它的行为一样(我没有尝试过自己)。但我的建议仍然有效。 GridView会将您发送到onMeasure方法的可用空间大小。如果您通过setMeasuredDimensions使用此值。你应该限制可用空间。 – snapix 2014-10-14 14:42:05

+0

这就像Onik在他的评论中说的,但如果你想避免包装布局,你可以使用我的建议。您原则上理解还是应该向您提供一些代码? – snapix 2014-10-15 09:01:19

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); 

但是,我不能想办法让这个规模以及针对多种设备。

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>