读书人

listView中多个listItem格局时 conve

发布时间: 2012-08-15 16:57:17 作者: rapoo

listView中多个listItem布局时 convertView缓存及使用(转)

最近有需求需要在listView中载入不同的listItem布局,开始没有使用convertView,加载了多个item后导致了内存泄露,所以回来研究convertView在多个listItem布局时的缓存及应用,并且和大家分享

构造Adapter时,没有使用缓存的?convertView,导致内存泄露

示例代码:
public View getView(int position, View convertView, ViewGroup parent) {
??View view = new Xxx(...);
??... ...
??return view;
}


描述:
??
以构造ListView的BaseAdapter为例,在BaseAdapter中提供了方法:



public View getView(int position, View convertView, ViewGroup parent){ }


来向ListView提供每一个item所需要的view对象。初始时ListView会从BaseAdapter中根据当前的屏幕布局实例化一定数量的view对象,同时ListView会将这些view对象缓存起来。当向上滚动ListView时,原先位于最上面的list item的view对象会被回收,然后被用来构造新出现的最下面的list item。这个构造过程就是由getView()方法完成的,getView()的第二个形参View convertView就是被缓存起来的list item的view对象(初始化时缓存中没有view对象则convertView是null)。
??
由此可以看出,如果我们不去使用convertView,而是每次都在getView()中重新实例化一个View对象的话,即浪费资源也浪费时间,也会使得内存占用越来越大。

修正示例代码:
public View getView(int position, View convertView, ViewGroup parent) {
??View view = null;
??if (convertView != null) {
??view = convertView;
??...
??} else {
??view = new Xxx(...);
??...
??}
??return view;
}

上述代码很好的解决了内存泄露的问题,使用convertView回收一些布局供下面重构是使用。

但是如果出现如下图的需求,convertView就不太好用了,convertView在Item为单一的布局时,能够回收并重用,但是多个Item布局时,convertView的回收和重用会出现问题。





Listview中有3种Item布局,即使convertView缓存了一些布局,但是在重构时,根本不知道怎么样去让convertView返回你所需要的布局,这时你需要让adapter知道我当前有哪些布局,我重构Item时的布局选取规则,好让convertView能返回你需要的布局

需要重写一下两个函数

@Override

public?int?getItemViewType(int?position) {}

官网解释如下,不解释了
Get the type of View that will be created by getView(int, android.view.View, android.view.ViewGroup)]getView(int, View, ViewGroup)?for the specified item.

ParameterspositionThe position of the item within the adapter's data set whose view type we want.
Returns
读书人网 >移动开发

热点推荐