android BaseAdapter getView 理解

ListView是安卓中非常常用的一个控件。

安卓设计使用Adapter来对ListView进行管理。

但是系统提供的Adapter无法满足一些复杂的显示情况,这个时候我们就需要使用BaseAdapter来自行实现ListView的控制。

其他的方法都很好说,这里主要解释一下getView方法。

首先ListView在设计时,为了保障系统的性能(毕竟是移动终端,系统资源有限),设计时并不是无限加载ItemView进去的。

试想一下,如果有1000条记录,难道要同时创建,并缓存1000个 ItemView对象吗?如果还包含图片等大型资源呢?

显然是不现实的。所以安卓设计时,采用了如下设计思路。


如上图所示,系统只会创建一屏ItemView,具体个数根据屏幕显示控件计算得到。

当第一个itemView彻底被遮盖时,系统会移动它作为最后一个ItemView显示。这样就保证始终只有7个ItemView被实例化。

但是显然Item8和Item1显示内容是不一样的,这时候,我们就需要用到GetView这个方法了。


getView中的convertView,其实就是屏幕显示的ItemView的引用。在第一屏数据显示是,convertView为空,因为他们都需要被重新创建。

在第二屏第一项数据被展示时,convertView就不在是空,而是被移动下来的第一屏第一项的View对象。

这时候我们需要做的,就是重新把新的数据填充上去,保证它显示的是第二屏第一项的数据即可。

具体参考链接:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html

至于我们经常见到的PlaceHolder这个东西,好吧,其实他只是一个常用的方式,为了不需要每次都重新getViewByID,来获取对象引用。

简单来说,就是用起来比较方便罢了。其实你也不是必须要用这东西。每次都从convertView中重新获取也不是不行,就是浪费代码,浪费资源罢了。


然后说说getView重复调用问题,多数都是由于重绘导致的,一般来说,奖Item的宽度和高度设置成fill_parent,尽量不要用match,这样会好很多。

如果需要重新绘制viewlist,可以使用notifyDataSetChanged,主要是起到刷新界面的作用。

具体参考链接:http://www.cnblogs.com/kissazi2/p/3721941.html


嘛,最后吐槽一下,感觉安卓很多控件设计的耦合性好高,而且即使想要自行分离变量,也非常困难。

作者想要写一个通用的Adapter,吧GetView里面的可变因素抽象,开放出来,结果发现,真这样实现了导致好多接口对象的产生,感觉还不如一个页面一个Adapter来实现的方便,所以就不在这里献丑了。这也侧面说明了,为什么安卓没有比较通用成熟的一些好的快速开发框架的原因。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值