Android中ListView的工作原理

在Android中,listView是一个重要的控件,在使用它时,我们经常自定义适配器Adapter将listView和数据、item布局联系起来;

那么listView在上下滑动时,其工作原理是什么呢?每条载着数据的item是怎么一个个加载进去的呢?当发生滑动时,被隐藏的item和新进入的item的底层是怎么工作的?根据这些底层原理我们能做哪些优化?下面我们来共同探讨这些问题。

============================================================================================

首先,自定义一个Adapter继承自BaseAdapter,覆写必须的四个方法:getcount,getItem,getId,getView;

在这四个方法中,getView是核心要覆写的方法。

a,将item布局加载进convertView中,convertView = LayoutInflater.from(context).inflate(item布局,null);

b,通过findViewById的方法将item中每个控件实例化

c,通过传入的数据,为item的每一个控件赋值;

通过以上三步,就完成了一个converView的初始化,执行一次getView方法,就会将这个converView返回出去,作为一个item进行绘制;

有多个数据,就会有多个position,每一个position都会触发getView方法,启动一个converView,绘制一个item,如此循环,就会将所有的数据,绘制成多个item,一条一条的,构成了我们手机界面上看到了listview(如通讯录清单、一条一条的微博等等);

=================================================================================================

那么,是不是有很多条数据,我们就要新建很多个convertView?,每次当屏幕滑动时,是否将滑过的 convertView销毁,将新出现的convertView新建出来?

当然NO!,我们知道,对象的销毁和创建会消耗大量的CPU资源,如果客户频繁滑动,就会导致卡顿,如此十分不好,android不会允许此事发生,所以,就引入了一个后台机制----convertView缓冲池

如果你的手机屏幕只能显示5条item,系统就只会新建5个convertView,每当我们滑动屏幕,被移出的item不会被销毁,而是放进了converView缓冲池,当下面的item要进入时,会引用这个被放入缓冲池的convertView,改变其控件的值后,就会从屏幕下方进入到屏幕内,如此往复。这样就大大优化了资源,加快了速度。

===================================================================================================

那么我们是否根据这个原理在编写程序时做进一步的优化?答案当然是必须的!

我们知道,每次某个控件执行findViewById相当于实例化了一次控件,虽然convertView不用每次都新建了,但如果其控件每次又要新建,同样会消耗大量的系统资源,所以我们需要对其进行优化:

首先,建立class ViewHolder,将所有控件放进去,作为其属性

第二步,将该class对象和convertView绑定:ViewHolder viewHolder = new ViewHolder;  convertView.setTag(viewHolder);

如此,就会将控件们和converView绑定,与之共存亡,只要convertView不销毁,这些空间就可以重复使用,不用新建;

第三步,设置这些控件的属性值:拿出viewHolder, ViewHolder viewHolder = (ViewHolder)convertView.getTag();  设置控件值:viewHolder.控件.set*****


以上的思想和方法时我们平时做项目需要学习和运用的地方~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值