0

我的活动由两部分组成:1)顶部的列表视图。2)底部(为简单起见只是一个黑色背景的TextView)。我希望将黑色 TextView 放置在 ListView 的最后一个元素之后。我可以通过将 ListView 的高度设置为 wrap_content 轻松实现这一点(请不要告诉我我不应该使用 wrap_content 作为 ListView 的高度): 在此处输入图像描述

这是问题开始的地方:我不希望 ListView 增长超过半个屏幕(当 ListView 中有很多项目时,我希望它表现得好像它是一个只占用的普通 ListView(可滚动)活动屏幕的一半,如下所示: 在此处输入图像描述

是否可以仅通过操作 XML 来做到这一点?如果是 - 如何?如果没有 - 请您指出如何在代码中实现这一目标的相关方向?

4

2 回答 2

1

这种类型的行为过于动态,无法在 XML 中定义,但使用自定义容器视图很容易实现。我对您的应用程序做了几个假设,主要是 Activity 的根布局只有两个孩子(ListView和页脚视图)。基于此,以下是一个自定义LinearLayout,它将为您提供所需的内容:

public class ComboLinearLayout extends LinearLayout {
    public ComboLinearLayout(Context context) {
        super(context);
    }

    public ComboLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //We're cheating a bit here, letting the framework measure us first
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        //Impose a maximum height on the first child
        View child = getChildAt(0);
        int newHeightSpec = MeasureSpec.makeMeasureSpec(getMeasuredHeight() / 2, MeasureSpec.EXACTLY);
        if (child.getMeasuredHeight() > (getMeasuredHeight() / 2)) {
            measureChild(child, widthMeasureSpec, newHeightSpec);
        }

        //Optional, make the second child always half our height
        child = getChildAt(1);
        measureChild(child, widthMeasureSpec, newHeightSpec);
    }
}

然后你可以在你的 Activity 布局中应用它,如下所示:

<com.example.myapplication.ComboLinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Hi Mom!"
        android:background="#0A0"/>
</com.example.myapplication.ComboLinearLayout>

容器代码的最终效果是,ListView当且仅当它测量到的高度大于容器高度时,它将测量的高度固定为容器高度的一半。否则,它允许ListView更小。

如果您需要,我添加了一个辅助技巧,它是一个可选的代码块,它强制页脚视图始终为屏幕高度的一半。如果您在 XML 中将页脚视图设置为固定高度,您可能可以从onMeasure(). 如果您使用该代码,最好将页脚视图设置为match_parentXML。

于 2013-08-19T17:15:16.257 回答
0

仅使用 xml 是不可能的。如果设置 ListView 的固定高度或重量,它将始终占据固定位置。要实现这一点,您必须随着列表视图的增长动态设置列表视图父高度,并在满足您的要求时停止它。希望它会帮助你。

于 2013-08-19T15:56:56.610 回答