Android ListView实现任意layout

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

转载于:https://my.oschina.net/lovelyBoy/blog/333064

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值