SimpleAdapter adapter = new SimpleAdapter(this, getData(),
R.layout.timenotes_item_left, new String[] { "text1", "text2",
"text3" }, new int[] { R.id.textView2, R.id.textView3,
R.id.textView4 }) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Map itemData = (Map) getItem(position);
int type = Integer.parseInt(itemData.get("type").toString());
View itemView = null;
switch (type) {
case 0:
Log.d("adapter", "type 0");
itemView = View.inflate(getApplicationContext(),
R.layout.timenotes_item_left, null);
break;
case 1:
Log.d("adapter", "type 1");
itemView = View.inflate(getApplicationContext(),
R.layout.timenotes_item_right, null);
break;
default:
Log.d("adapter", "type default");
break;
}
return itemView;
}
};
ListView listView = (ListView) findViewById(R.id.listView1);
listView.setAdapter(adapter);
以上代码存在内存泄漏的问题,详细原因如下:
构造Adapter时,没有使用缓存的 convertView
描述:
以构造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对象的话,即浪费资源也浪费时间,也会使得内存占用越来越大。ListView回收list item的view对象的过程可以查看:
android.widget.AbsListView.java --> void addScrapView(View scrap) 方法。
示例代码:
public View getView(int position, View convertView, ViewGroup parent) {
View view = new Xxx(...);
... ...
return view;
}
修正示例代码:
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
if (convertView != null) {
view = convertView;
populate(view, getItem(position));
...
} else {
view = new Xxx(...);
...
}
return view;
}
参考资料:http://blog.csdn.net/com360/article/details/6682409