在XML中模拟ListView的wrap_content行为,达到特定高度

时间:2013-08-19 15:41:58

标签: android android-layout android-listview

我的活动由两部分组成:1)顶部的列表视图。 2)底部(为简单起见,它只是一个带有黑色背景的TextView)。 我希望将黑色TextView放在ListView的最后一个元素之后。我可以通过将ListView的高度设置为wrap_content来轻松实现这一点(请不要告诉我,我不应该将List_content用于ListView的高度): enter image description here

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

是否可以通过操纵XML来实现这一点?如果是 - 如何?如果没有 - 请你指点一下如何在代码中实现这个目标的相关方向?

2 个答案:

答案 0 :(得分: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()中删除第二部分。如果您使用该代码,如果页脚视图在XML中设置为match_parent,它将最有效。

答案 1 :(得分:0)

不可能只使用xml。如果设置ListView的固定高度或重量,它将始终采用固定位置。要实现这一点,您必须在listview增长时动态设置listview父高,并在满足您的要求时停止它。希望它会对你有所帮助。