ListView将其他视图从屏幕上移开

时间:2012-03-09 15:19:57

标签: android android-layout

我正在努力让布局看起来正确,而且我试图生成我问题的最短,最小的例子。

我的目标是在屏幕顶部和底部有一个页眉和页脚视图,两者之间有一个ListView,另一个视图(让我们称之为标签,它是屏幕截图中的灰色框)直接位于ListView下方。 <{1}}需要滚动时,应始终显示此标签和页脚。

视觉结果

ListView不需要滚动时(这是正确的):

when the ListView doesn't need to scroll

ListView需要滚动时,页脚和灰框被推离屏幕(错误):

when the ListView needs to scroll

布局

ListView

测试活动

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical">
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="header"
            android:padding="20dp"
            android:textSize="18sp"
            android:background="@color/red"/>
    <ListView android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:id="@android:id/list" />
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="this should be directly below the ListView, but not pushed off screen when the ListView needs to scroll"
            android:padding="5dp"
            android:background="@color/light_gray"
            android:textColor="@color/black"/>
    <!-- Used to push the footer to the bottom -->
    <View android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1"/>
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="footer"
            android:padding="20dp"
            android:textSize="18sp"
            android:background="@color/blue"/>
</LinearLayout>

我尝试了一些不同的方法,例如提供public class TestActivity extends ListActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ArrayList<String> items = new ArrayList<String>(); items.add("one"); items.add("two"); items.add("three"); items.add("four"); items.add("five"); items.add("six"); items.add("seven"); items.add("eight"); items.add("nine"); items.add("ten"); setListAdapter(new ArrayAdapter<String>(this, R.layout.simple_list_item_1, items)); setContentView(com.myproject.android.R.layout.test); } } ListView并删除我用来将页脚推到底部的空白layout_weight="1"。这几乎就是我想要的,它会在View滚动时保持页脚和标签可见,但是当它只有1或2个项目时,我需要ListView正下方的灰色框。我还试图使用ListView,但没有成功。我想我完全误解了事情。

修改

这是我使用RelativeLayout的尝试仍然不正确。

RelativeLayout

相对布局(仍然错误):

relative layout attempt

5 个答案:

答案 0 :(得分:9)

android:layout_weight="1"添加到列表视图中。这将使它成为LinearLayout中最大的元素,而不会将其他元素从屏幕上移开。

答案 1 :(得分:7)

此布局将标题添加到屏幕的顶部以及脚注和底部。该列表填充了屏幕的其余部分。随着这些aproach列表元素永远不会被页脚遮挡。了解如何在XML下面添加灰色框...

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
<TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="header"
        android:padding="20dp"
        android:textSize="18sp"
        android:background="@color/red"
        android:id="@+id/header"
        />
<TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="footer"
        android:padding="20dp"
        android:textSize="18sp"
        android:background="@color/blue"
        android:layout_alignParentBottom="true"
        android:id="@+id/footer"/>
<ListView android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:id="@android:id/list"
          android:layout_below="@id/header"
          android:layout_above="@id/footer"/>


</RelativeLayout>

确定。此XML解决了页脚丢失的问题。现在我们必须在列表的末尾添加一个灰色框。我认为有两种方法可以做到:

答案 2 :(得分:1)

回答这个问题的时间晚了两年,但我会留下我的解决方案,这样可以帮助有同样问题的人。我使用2个嵌套的LinearLayouts并使用layout_weigth解决了这个问题。也许不是最佳的性能布局,但它达到了预期的效果。

您需要以这种方式安排布局:

  1. 您的ListView将具有wrap_content高度,以便在未填满整个屏幕时仅占用所需空间。
  2. 您的ListView将位于使用layout_weight的高度布局内,因此当不填充整个屏幕时,列表将仅占用所需的空间,并且当它具有大小以便将视图推出时,仅占用屏幕的有限空间屏幕。
  3. 应该在列表正下方的灰色框视图将具有wrap_content高度,并且将是步骤2的布局的一个辛辣。
  4. 此布局和灰色框将位于第二个布局中,其中包含wrap_content高度,因此它们可以保持在一起。
  5. 现在你有一个带有列表和灰色视图的布局,如果它太大,列表不会将其他视图推出屏幕;您只需将页脚视图移动到屏幕底部即可。

    5a上。如果您使用RelativeLayout作为根布局,您可以像sgallego所说的那样使用android:layout_alignParentBottom。

    5b中。但是如果您使用的是LinearLayout,则需要使用layout_weigth创建第三个布局并将其放入第4步的布局中,并使用layout_weigth创建一个空视图以填充空白区域。

  6. 这是一个注释的例子。

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <!-- Header -->
        <TextView
            android:id="@+id/RecordStudy_StudyLabel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/RecordStudy_StudyLabel"
            android:textSize="@dimen/text_large" />
    
        <!-- Body -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:orientation="vertical" >
    
            <!--
            This layout encapsules the list and the button that must be immediately
            below the list with a wrap_content height, so the list plus the button
            fills only as much space as they need (if the list is not big enouth to
            fill the entire screen).
            -->
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical" >
    
                <!--
                Layout with varaible size with a list inside.
                Using layout_weight tells android that this layout should not grow
                greater then the screen, but uses only the free space. 
                 -->
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:orientation="vertical" >
    
                    <!--
                    Inside this limited height layout, there is a list with height
                    wrap_content so it can grow as much as it needs INSIDE the
                    layout (through scrolling).
                    -->
                    <ListView
                        android:id="@+id/RecordStudy_StudyList"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content" />
    
                </LinearLayout>
    
                <!-- Button immediately below the list -->
                <Button
                    android:id="@+id/RecordStudy_AddStudy"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/RecordStudy_AddStudy" />
    
            </LinearLayout>
    
            <!-- Space between the list and the footer -->
            <View
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1" />
    
        </LinearLayout>
    
        <!-- Footer -->
        <Button
            android:id="@+id/RecordStudy_ConfirmButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/RecordStudy_ConfirmButton" />
    
    </LinearLayout>
    

答案 3 :(得分:0)

我实现并发现有用的一个解决方案是将listview保持在具有固定高度的线性布局中,以便它不会扩展并与其他项重叠。

这样的事情:

<TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="header"
            android:padding="20dp"
            android:textSize="18sp"
            android:background="@color/red"
            android:id="@+id/header"
            />

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="150dip" //assume 150dip height is sufficient

    <ListView android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:id="@android:id/list"
              android:layout_below="@id/header"/>
</LinearLayout>

    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="this should be directly below the ListView, but not pushed off screen when the ListView needs to scroll"
            android:padding="5dp"
            android:background="@color/light_gray"
            android:textColor="@color/black"
            android:layout_below="@android:id/list"/>

答案 4 :(得分:0)

对我有用的解决方案是在列表视图的底部添加正填充,并在&#34;页脚&#34;的顶部添加负填充。这将在线性布局或相对布局中工作。

<ListView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="50dp"/>

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="-50dp"/>