问题描述:
在开发的过程当中,由于手机屏幕的大小的限制,经常需要使用滑动的方式来显示更多的内容。在最近的工作中,遇见一个需求,需要将ListView嵌套到NestedScrollView中显示
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:orientation="vertical"
tools:context="com.ucfo.youcai.view.questionbank.fragment.QuestionItemFragment"
tools:ignore="RtlCompat">
<!--主布局-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/question_content3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorWhite"
android:lineSpacingExtra="@dimen/dp_5"
android:paddingBottom="@dimen/dp_10"
android:paddingTop="@dimen/dp_10"
android:text="使用现金流量表来评价一个公司的持续偿债能力时,要重点考虑哪部分现金流:"
android:textColor="@color/color_666666"
android:textSize="@dimen/sp_13" />
<!--题目选项列表-->
<ListView
android:id="@+id/question_optionsListview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorWhite"
android:choiceMode="singleChoice"
tools:listitem="@layout/item_questionbank_options" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
问题:
结果就是listview值显示一行
解决办法:
不采用自定义listview的方式,因为在ScrollView中嵌套ListView空间,无法正确的计算ListView的大小,故可以通过代码,根据当前的ListView的列表项计算列表的尺寸。实现代码如下:
public void setListViewHeightBasedOnChildren(ListView listView) {
// 获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i++) {
// listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView(i, null, listView);
// 计算子项View 的宽高
listItem.measure(0, 0);
// 统计所有子项的总高度
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
// listView.getDividerHeight()获取子项间分隔符占用的高度
// params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams(params);
}
设置完adapter之后直接调用这个方法,重新结算listview的高度就完美解决!