BaseAdapter的getView方法中对setOnclickListener优化

在应用开发中凡是又列表式的界面我都采取使用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一样只会初始化一个屏幕可见的个数,虽然这种对象所占内存不大但是积少成多都是危险,在写代码的时候我们需要考虑没一点,同样是积少成多那么整个应用就在一定程度上达到唯美。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-09 14:48:53

BaseAdapter的getView方法中对setOnclickListener优化的相关文章

[Android]在Adapter的getView方法中绑定OnClickListener比较好的方法

查看完整文章:http://www.cnblogs.com/tiantianbyconan/p/4146512.html 来自: "https://github.com/wangjiegulu/AndroidBucket/blob/master/src/com/wangjie/androidbucket/ 标签:AndroidBucket [1].[代码] [Java]代码 跳至 [1] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 public View getView(in

android 分享一个处理BaseAdapter,getView()多次加载的方法

一:BaseAdapter介绍 BaseAdapter是listview,gridview等列表,使用的数据适配器,它的主要用途是将一组数据传到ListView.Spinner.Gallery及GridView等UI显示组件,如果listView列表的数据项过多,如1000项,我们如果把这1000项全部放到界面中去,软件直接内存溢出了,BaseAdapter刚才可以帮我们解决这个问题,BaseAdapter工作原理图如下: 从上图中看出,如果我们有1000个数据项,实际显示的只有7项,其它的缓存

[转]Android Adapter以及getView()方法的理解

Android Adapter基本理解: 我的理解是: 1.一个有许多getter的类(就是getView(),getCount()....这些方法) 2.有多少个get方法?都是什么? 这些getter是特定的,你可以复写他们,全部的方法如下 其中一般我们只用复写getCount(),getView(),getItemId(),getItem()这四个方法 3.这些被谁调用? 这些getter是被android系统自行调用的(具体如何调用,作为像我这样的新手做稍微了解就好) 4.为什么要复写这

继承BaseAdapter覆写getView()方法解析

当我们继承BaseAdapter自定义适合自己使用的Adapter时候,不可避免的要覆写getView()方法.自己在分析蓝牙4.0官方源代码遇到这个问题,分析了几遍,有所领悟,参考了这篇博文http://blog.csdn.net/pkxiuluo01/article/details/7380974,现结合蓝牙4.0官方的这部分代码将getView()解析一下. //当界面每显示出来一个item时,就会调用该方法,getView()有三个参数,第一个参数表示该item在Adapter中的位置:

ASP.NET中常用的优化性能的方法

1. 数据库访问性能优化  数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响.系统将用户的数据库连接放在连接池中,需要时取出,关闭时收回连接,等待下一次的连接请求. 连接池的大小是有限的,如果在连接池达到最大限度后仍要求创建连接,必然大大影响性能.因此,在建立数据库连接后只有在真正需要操作时才打开连接,使用完

android getView方法不执行的一个原因是布局文件中没有给列表显示的位置

一个原因是布局文件中,没有给列表显示的位置. 例如:下面的布局 <com.xxx.view.BaseListView android:id="@+id/list_find" android:layout_width="match_parent" android:layout_height="match_parent" android:cacheColorHint="@android:color/transparent"

Android ListView的适配器 Adapter 中GetView方法调用次数大于数据条数的问题

情况描述: 今天在写数据展示的时候,用了ListView,在它的适配器当中,发现getview方法执行的次数是数据条目的N倍(我这边显示的是4倍,这个倍数值不知道会不会变化),这显然是不科学的! 查阅资料,发现是ListView的布局问题.我把 android:layout_height="wrap_content"高度设置成了wrap_content.而wrap_content值使得ListView没有取到实际的高度,他还要根据计算才能确定,而每一次计算应该会触发listview的渲

工程优化方法中的“最速下降法”和“DFP拟牛顿法”的 C 语言实现

这个小程序是研一上学期的“工程优化”课程的大作业.其实这题本可以用 MATLAB 实现,但是我为了锻炼自己薄弱的编码能力,改为用 C 语言实现.这样,就得自己实现矩阵的运算(加减乘除.求逆.拷贝):难点是求偏导,通过查资料,发现可以通过导数定义,即取极限的方法,来逐步逼近求得梯度:另外,没法做到输入任意公式,只能将公式硬编码为函数,而求导函数需要传入公式,就直接传入函数指针了.思考.编码.调试.测试共耗费两周左右时间,完成于 2013/01/10.虽然为了认真做这个大作业而耽误了期末考试的复习,

Android ListView getView()方法重复调用导致position错位

问题现状:Android ListView getView()方法重复调用导致position错位 解决办法:把ListView布局文件的layout_height属性改为fill_parent或者match_parent. <ListView android:id="@+id/myphoto_listview" android:layout_width="match_parent" android:layout_height="match_pare