在应用开发中凡是又列表式的界面我都采取使用ListView来呈现界面,并且需要一个BaseAdapter来加载数据进去,所以我们就需要重写getView方法,那么问题来了,在每一个Item都有一个按钮的话我们需要给按钮setOnclickListener,假设我们按一下代码来写的话:
ActiveClick ac = new ActiveClick();
convertView.findViewById(R.id.main).setOnClickListener(ac);
通过打印我们可以看到log日志:
每一个的Listener的地址都不一样也就是说每一项的都会有一个Listener占据着内存,这样上下滑动又是数不清的内存被占用了,就违背了ListView的复用精神了,内存开销太大了,所以我们需要往复用的方向去写,所以:
ActiveInfoClick ac;
if (null == view) {
holder = new ViewHolder();
.
.
.
ac = new ActiveClick();
view.setTag(holder);
view.setTag(R.id.info_image, imageClick);
} else {
holder = (ViewHolder) view.getTag();
ac = (ActiveClick) view.getTag(R.id.info_image);
}
holder.infoImage.setOnClickListener(ac);
通过上面的代码我们优先的复用了Listener,依然通过log日志查看:
由于界面的item高度比较大,所以6个需要滑动屏幕一次。可以看出来456已经复用之前的listener,也就是说Listener的个数就会跟ListView一样只会初始化一个屏幕可见的个数,虽然这种对象所占内存不大但是积少成多都是危险,在写代码的时候我们需要考虑没一点,同样是积少成多那么整个应用就在一定程度上达到唯美。