我的活动由两部分组成:1)顶部的列表视图。 2)底部(为简单起见,它只是一个带有黑色背景的TextView)。 我希望将黑色TextView放在ListView的最后一个元素之后。我可以通过将ListView的高度设置为wrap_content来轻松实现这一点(请不要告诉我,我不应该将List_content用于ListView的高度):
这就是问题开始的地方:我不希望ListView增长超过半个屏幕(当ListView中有很多项目时,我希望它表现得好像是普通的ListView(可滚动)只占用活动屏幕的一半,如下所示:
是否可以通过操纵XML来实现这一点?如果是 - 如何?如果没有 - 请你指点一下如何在代码中实现这个目标的相关方向?
答案 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父高,并在满足您的要求时停止它。希望它会对你有所帮助。