Android中ListView的工作原理

原创 2016年06月01日 21:40:10

在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*****


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

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

相关文章推荐

Android之ListView原理学习与优化总结

在整理前几篇文章的时候有朋友提出写一下ListView的性能优化方面的东西,这个问题也是小马在面试过程中被别人问到的…..今天小马就借此机会来整理下,网上类似的资料蛮多的,倒不如自己写一篇,记录在这个...
  • hhq163
  • hhq163
  • 2012-10-31 15:16
  • 13089

Android ListView工作原理完全解析,带你从源码的角度彻底理解

本文转载自:http://blog.csdn.net/guolin_blog/article/details/44996879 在Android所有常用的原生控件当中,用法最复杂的应该就是ListV...

Android ListView工作原理完全解析,带你从源码的角度彻底理解

出处:http://blog.csdn.net/guolin_blog/article/details/44996879 好文章,收藏,现在读起来一知半解的,先收着,以后慢慢研究 在And...

Android ListView工作原理完全解析,带你从源码的角度彻底理解

在Android所有常用的原生控件当中,用法最复杂的应该就是ListView了,它专门用于处理那种内容元素很多,手机屏幕无法展示出所有内容的情况。ListView可以使用列表的形式来展示内容,超出屏幕...

Android ListView工作原理完全解析,带你从源码的角度彻底理解

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/44996879 在Android所有常用的原生控件当中,用法最复杂的应该就是...

Android ListView工作原理完全解析,带你从源码的角度彻底理解

原文请见:http://blog.csdn.net/guolin_blog/article/details/44996879 在Android所有常用的原生控件当中,用法最复杂的应该就是Li...

android使用ListView和Adapter.getView Recycler的工作原理

正文始 项目用到ListView,由于要用到ImageView,图片源不是在资源里面的,没法使用资源ID,因此无法直接使用 SimpleAdapter,要自己写一个Adapter。在使用ListVie...

Android ListView工作原理完全解析,带你从源码的角度彻底理解

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/44996879 在Android所有常用的原生控件当中,用法最复杂的应该就是...

Android ListView工作原理完全解析,带你从源码的角度彻底理解

在Android所有常用的原生控件当中,用法最复杂的应该就是ListView了,它专门用于处理那种内容元素很多,手机屏幕无法展示出所有内容的情况。ListView可以使用列表的形式来展示内容,超出屏幕...

Android ListView工作原理完全解析,带你从源码的角度彻底理解

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/44996879 在Android所有常用的原生控件当中,用法最复杂的应该就是Lis...
  • wy819
  • wy819
  • 2016-05-16 20:42
  • 81
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)