原生 Android 并不支持在一个 activity 中垂直地排列两个 listview,本文章中介绍了一种实现方法。
原理
为了实现这种效果,一开始我想到的办法是 listview 中加上一个 footerview,footerview 里面嵌套一个listview,但是实际操作之后发现 footerview 里的 listview 只显示一项,这个问题困扰了半天,一直没有找到合适的解决办法,直到昨天晚上偶然看到一篇博文介绍说,scrollview 里嵌套 listview 也出现了同样的问题,解决办法是动态设置 listview 的高度,于是我用这种方法也试了试,结果还真解决了。
关键代码
动态设置 listview 的高度:
public void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter adapter = listView.getAdapter();
if (adapter != null) {
int totalHeight = 0;
System.out.println(adapter.getCount());
for (int i = 0; i < adapter.getCount(); i++) {
View listItem = adapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1));
((MarginLayoutParams) params).setMargins(0, 0, 0, 0);
listView.setLayoutParams(params);
}
}
footerview.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linearlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="分隔标识=================" />
</LinearLayout>
<ListView
android:id="@+id/head_listView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</ListView>
</LinearLayout>