ListView:如何正确定义布局?

时间:2014-01-17 18:59:49

标签: android android-layout listview android-listview

我知道这个话题已经讨论了很多次,但我发现它太混乱了,所以在试着看看SO和Google后,我决定问一下。

我有一个辅助Activity从主要调用。布局定义如下(我发布了我认为相关的部分,如果需要额外的东西,只需要它)。在代码下方,您可以找到一些屏幕截图。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/rounded_edges"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context=".Bloqueados" >

  <!-- TextView to set the activity tittle (I'm using a customized theme) -->
  <TextView
    ... />

    <!-- LinearLayout which shows the orange square -->
    <LinearLayout
       android:id="@+id/block_info"
       android:background="@drawable/rounded_edges_orange"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content" >

       <EditText
           ... >
      </EditText>
    </LinearLayout>

    <!-- LinearLayout to ask for the user to be blocked -->
    <LinearLayout
       ... >

        <EditText
            ... >

            <requestFocus />
        </EditText>

        <ImageButton
            ... />
    </LinearLayout>    

    <!-- Here it goes, the LinearLayout that contains the ListView -->

    <LinearLayout
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"       
       android:baselineAligned="false"
       android:orientation="vertical" >

       <!-- This TextView is shown only if the ListView is empty -->
       <TextView
         android:id="@+id/block_empty"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="5dp"
         android:paddingLeft="30dp"
         android:text="@string/block_empty"
         android:textStyle="italic"
         android:textColor="#3085ef" />

       <!-- Else, this ListView is shown --> 
       <ListView
         android:id="@+id/block_list"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:scrollbars="vertical" >
       </ListView>

       <!-- Save button -->
       <Button
         android:id="@+id/btn_block_save"
         style="?android:attr/buttonStyleSmall"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center"
         android:layout_marginTop="10dp"
         android:onClick="btn_close"
         android:background="@drawable/botones"
         android:textColor="#FFFFFF"
         android:text="@string/btn_save" />    
    </LinearLayout>

</LinearLayout>

所以,从图形上看,这是前截图:

Former screenshow

这里没什么奇怪的。因此,让我们用ListView填充一些项目:

Full list

好的,仍然没什么奇怪的,但屏幕高度现在已经填满了。让我们在ListView中添加另一个项目。

Overflowed

这就是问题所在。 “保存”按钮已消失(好吧,它位于最后一个ListView项目下方,但它超出了屏幕布局)。我知道使用ScrollView + ListView是一种不好的做法,所以即使我有一个完美的解决方法,我也想避免使用它并正确地做事。所以问题是:当下一个添加的项目将其下方的元素移出屏幕布局时,如何使ListView开始滚动?

谢谢!

1 个答案:

答案 0 :(得分:2)

layout_height =“wrap_content”表示增长直到显示所有孩子。尝试使用layout_height =“0dp”和layout_weight =“1”代替。像这样:

   <ListView
     android:id="@+id/block_list"
     android:layout_width="fill_parent"
     android:layout_height="0dp"
     android:layout_weight="1"
     android:scrollbars="vertical" >
   </ListView>