前言:此处仅记录开发时遇到的问题,作为笔记供后期参考。
适用场景:当遇到ScrollView嵌套ListView时,ListView的数据会出现展示不全的问题。
失误:本人一开始仅仅是通过下方展示的方法根据Item高度设置ListView的整体高度,如下:
public static void setListViewHeightBasedOnChildren(ListView listView) {
// 获取ListView对应的Adapter
Adapter 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.getListPaddingBottom() + listView.getListPaddingTop();
// listView.getDividerHeight()获取子项间分隔符占用的高度
// listView.getListPaddingBottom()获取ListView的内边距
// params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams(params);
}
仅仅通过这个方法,乍一运行,感觉好像没问题,但是过几天就会有人跟你反应仍会出现最后一行数据显示不全的问题。
解决方法:网上也参考了其他网友提供的方法,经测试,找到一种比较合适的解决办法:自定义ListView,并重写onMeasure()方法。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
在布局中使用这个自定义的ListView,并且结合上述根据Item动态设置ListView高度的方法一起使用,能够有效解决问题。
adapter.notifyDataSetChanged();
Util.setListViewHeightBasedOnChildren(cusListView);