在2.0版本的研发中,因为有些界面显示效果展示的需要,自己在实现时首先想到的是使用ScrollView中嵌套ListView,由于ScrollView和ListView都有滚动效果,所以就禁掉了ListView的滚动效果。具体的禁止实现有两种方式,分别为:
第一种是指定ListView容器的高度为指定的高度,即重写方法@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int expendSpc=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expendSpc);
}
第二种是计算每个item的高度,网上有很多这样的代码。
两种方式的思路都是一样的感觉,都是指定ListView组件的高度。但是问题来了,当ListView被指定固定的高度之后,就不能再复用了。因为当ListView没有被指定固定高度的时候,系统会默认ListView(没有指定它的高度)的最大高度为出去标题栏的的高度(这种是布局中除了ListView组件外,没有其他组件了),当然当你的布局文件中还有其他的组件时,ListView的高度是除去其他组件后的剩余的高度。一旦你指定ListView的高度后,则系统就不会对ListView使用复用的方式,因为你告诉了系统ListView的高度,系统就会认为ListView的高度是你指定的值,并会渲染出指定高度的内容。此时就不会再使用复用了。这样的话就很有可能导致OOM问题!
那如何解决OOM问题呢?一般你需要使用ScrollView和ListView嵌套的方式,无非就是需要在ListView的顶部或者下部添加其他的组件。想想ListView有没有其他的方法可以在头部或尾部添加其他的组件呢?哈哈,你肯定已经想到了,那就是ListView的addHeaderView(v)、addHeaderView(v, data, isSelectable)、this.addFooterView(v),addFooterView(v, data, isSelectable)方法。
添加头部:
当需要在ListView的顶部添加其他组件时,可以将所需要的组件单独写一个布局文件,然后View v = View.inflate(getContext(), R.layout.head_live, null);最后是listView.addHeaderView(v);就行了,头部中的其他组件完全和界面中的其他组件一样使用。
添加尾部:
当需要在ListView的尾部添加其他组件时,请参考添加头部哈^_^。
这样既能做到在ListView头部或尾部添加其他组件,又能做到做到item复用避免产出OOM问题。