前言
有些需求中界面里面除了listview还有其他内容需要显示,而且内容还不少,这样的话交给listview的空间就少了很多,这样就得嵌套一层scrollview来让整个界面都可以滑动,才能完整的看到listview,不至于就那么一小块地方在那里上下滑动。
然后在scroll里面嵌套listview问题就出来了,listview只显示了一行或者两行数据,这就蛋疼了,当然可以手动给listview设置一个高度,但是这显然不能适配所有手机屏幕的显示。这里记录一下解决方式。
解决一
我之前采取的方式是重新手动计算ListView高度,代码如下:
public class UIUtil {
public static void setListViewHeightBasedOnChildren(ListView listView) {
//获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i++) { //listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0); //计算子项View 的宽高
totalHeight += listItem.getMeasuredHeight(); //统计所有子项的总高度
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
//listView.getDividerHeight()获取子项间分隔符占用的高度
//params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams(params);
}
}
然后在用到listview的地方再调用就行了。
问题
然鹅昨天发现会在oppo,系统版本4.2.2上面会报空指针,我6.0系统没问题。具体原因没有没有探究,因为我要先解决问题,报错代码来自于这一行:
listItem.measure(0, 0);
解决二
然后我就换了另外一种方式,自定义listview,重写onMeasure方法:
@Override
/**
* 重写该方法,达到使ListView适应ScrollView的效果
*/
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
这里主要是对高度进行了重绘,MeasureSpec.AT_MOST测量模式:The child can be as large as it wants up to the specified size.需要展示的子view会尽量大到它具体的大小。强行设置AT_MOST来测量ListView自适应。
别忘记重新换控件引用。
然后就是进入界面的时候,会直接定位到listview的顶部,解决:
scrollview.smoothScrollTo(0, 0);
问题
严重的性能问题,根据官方设计建议,ListView其实是禁止放在ScrollView等垂直滚动视图中的,具体说明参看Android应用性能优化系列视图篇——ListView自适应导致的严重性能问题,强行放置的结果就是ScrollView中嵌有列表的页面可能会卡出翔,文章中也给出了几点建议。但是我使用的场景是不会用大量数据的,性能再耗也不会卡/姚明笑~
解决三
但是数据量大的怎么办呢?上面引文中提到了一个自定义控件,SimulateListView或许可以满足需求,但是我木有尝试,这里做一个记录而已,以备不时之需。
这次没有代码
本文作者:paradoxie
个人主页:谢盒盒的小黑屋,不止说技术
简书地址:简书主页,专注技术类
github地址:paradoxie
转载请注明出处,蟹蟹!
-------我的梦想真的是做一条咸鱼!