看到标题,很多人会奇怪这是一种什么设计,ListView 不是就可以滑动了嘛,为什么还要 ScrollView 呢,需求总是千
奇百怪的,看看下面这张图:
这两张图是一个界面,两个 ListView 嵌套在一个 ScrollView 中,用户可以操作的仅仅是滑动 ScrollView ,而
ListView 会根据内容自动调整高度,全部显示。
如果只是简单的将 ListView 的高度设为 wrap_content 的话,那么 ListView 并不会根据内容调整高度,而是只显示第
一条数据。
这里提出一种比较简单的解决办法,根据内容测量实际高度,然后在代码中设置 ListView 的高度:
private void setListViewHeightBasedOnChildren(ListView listView) {
if (listView == null) {
return;
}
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
measure 在 LinearLayout 中才能正常使用,如果是 RelativeLayout 则显示不正常。