【第22期】观点:IT 行业加班,到底有没有价值?

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工作原理完全解析,带你从源码的角度彻底理解

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

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

这一篇对郭大神的《Android ListView工作原理完全解析,带你从源码的角度彻底理解》博客学习总结。

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

Android中ListView的使用(一)

本文包括ListView的基本使用,convertview的机制,以及listview的刷新和局部刷新

Android ListView使用详解

最近在做android上有关采用ListView进行信息显示的开发工作,发现有很多实现的方法,不过思想基本是一致的。网上大部分的测试程序采用的是数组存储要显示的信息,但是为了更好地对信息进行管理,我采...

Android基础之ListView的使用详解

今天给大家带来《android应用开发全程实录》中关于listview和adatper中的部分。包括listview的基本使用,listview的优化等。 我们经常会在应用程序中使用列表的形式来展现...

Android中ListView添加事件并获取选中项的值

以下这篇文章,清晰而完整地讲解了ListView通过适配器来配置其样式的方法和点击事件的实现: ---------------------------------------------------...

Android中ListView分类

Android中ListView组件分类实现。

Android中通过ListView的实现简单新闻列表

Android中通过ListView的实现简单新闻列表 今天班上的同学问到我ListView怎么用,叫我帮他写个简单的新闻列表的例子,并且通过点击列表进入新闻详情也面.     于是就把这个小demo...

Android ListView分类/分组效果 - 第二种实现方式

之前的文章  《 Android ListView分类/分组效果 - 第一种实现方式》,当前是第二种实现方式。 一、实现ListView分类显示效果,目前我知道的有两种方案: 1. 每一个...

[Android基础]Android中ListView详解

ListView是手机系统中非常常用的一个组件,以垂直列表的形式显示所有列表项,今天我们来探索一下吧。 首先我们来了解一下ListView的基本属性吧。XML属性 andorid:divider...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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