ListView等的样式和内容适配器不复用问题

在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问题。

你可能感兴趣的:(android开发)