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和GridView原理分析

对于Android开发来说,ListView控件在应用开发中的作用是举足轻重的,它以列表的形式展示内容,并且能够根据数据长度自适应显示。   列表数据的显示需要四个元素,分别为:   (1)用来展...
  • yyg_2015
  • yyg_2015
  • 2016年09月26日 11:25
  • 481

ListView工作原理详细分析(一)

引言 ListView是Android系统中最常用也是最复杂的原生控件,了解ListView的工作原理非常必要。 ListView加载非常多数据的时候,上下滑动也不会造成oom等问题,随着手指的滑...
  • coder_nice
  • coder_nice
  • 2017年02月15日 12:00
  • 852

Listview绘制原理 与adapter

Listview绘制原理 与adapter   ListView绘制的过程如下: 首先,系统在绘制ListView之前,将会先调用getCount方法来获取Item的个数。 之后每绘制一个It...
  • wangwei890702
  • wangwei890702
  • 2013年06月26日 16:30
  • 3682

解析Android ListView工作原理及其缓存机制

这一篇对郭大神的《Android ListView工作原理完全解析,带你从源码的角度彻底理解》博客学习总结。...
  • Libmill
  • Libmill
  • 2015年11月04日 22:10
  • 4662

ListView 和 GridView的区别

ListView 和 GridView 控件均用于显示应用中数据的集合。它们的功能十分相似,但是显示数据的方式不同。它们都派生自 ItemsControl 类。ListView 采用垂直堆叠的方式显示...
  • qq_29134495
  • qq_29134495
  • 2016年05月21日 17:49
  • 846

ListView工作原理

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/44996879 在Android所有常用的原生控件当中,用法最复杂的应该就是Lis...
  • yuan381119866
  • yuan381119866
  • 2015年12月11日 10:57
  • 430

Android开发ListView中包含EditText控件遇到的问题

Android开发ListView中包含EditText控件遇到的问题
  • qin20082012
  • qin20082012
  • 2016年10月10日 17:12
  • 2827

Android listView用法详解

1. 前言 在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。 列表的显示需要三个元素: 1.ListVeiw:用来展示列表...
  • zhaokx3
  • zhaokx3
  • 2016年10月21日 14:51
  • 970

Android基础--ListView的显示几种方式

目前常用的ListView显示的方式有三种 【1】BaseAdapter 【2】ArrayAdapter 【3】SimpleAdapter 通过API Code 可以看出,实际上ArrayAdapt...
  • CSDN_Lzj_2008
  • CSDN_Lzj_2008
  • 2017年06月27日 23:43
  • 307

listview+edittext完美解决方案

通常如果listview中的item内容有edittext的时候,会出现很多问题。 主要有1.点击弹出编辑框,edittext会失去焦点。            2.输入内容后,向下滑动因为listv...
  • u013377714
  • u013377714
  • 2015年12月21日 16:19
  • 10207
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中ListView的工作原理
举报原因:
原因补充:

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