Android AdapterView 源码分析以及其相关回收机制的分析

  次阅读 作者:智能小宝 来源:互联网 2015-10-02 16:13 我要评论(0)

前言

忽然,发现,网上的公开资料都是教你怎么继承一个baseadapter,然后重写那几个方法,再调用相关view的 setAdpater()方法, 接着,你的item 就显示在手机屏幕上了。很少有人关注android adpater模式机制的实现原理,比较深入的也不过是说说adapter getview()中的回收情况。今天把相关的源码看了一遍,把自己的理解记录下来。

AdpaterView 概览

AdpaterView

api手册的说明:An AdapterView is a view whose children are determined by an Adapter.

实际上android里面ListView, GridView, Spinner , Gallery等view都是基于设计模式上的设配器模式实现的,只要熟悉设配器模式的相关知识,就知道如何从源码里面找到相关的实现线索。

认识AdapterView

源码链接https://github.com/android/platformframeworksbase/blob/master/core/java/android/widget/AdapterView.java

要理解listview等的实现,其父类是不得不看。源码有1200多行。阅读完AdapterView,能搞明白以下问题

响应数据的更改。

(793 - 842)

知道点击view的时候,获得对应的位置.

(593 - 615)

响应数据的更改

这里假设你已经打开了AdpaterView 的 793 到 842 行。。

在我刚开始用adapterview 的时候,最让我费劲的就是,为什么我调用adpater 的 notifyDataSetChanged() 就能更新view 的状态了呢,然后跟调用notifyDataSetInvalidated() 两者之间又有什么区别呢?以前,找了一下资料,没找到很详细的说明,现在从源码里面找答案的话,就很清晰了。

首先,我们要明白一种设计模式:观察者设计模式。

我相信你,应该能明白观察者模式是个什么样的实现了。。。

AdapterView 之所以能对Adapter 的数据更新进行响应,就是因为其在Adapter上注册了一个数据观察者(AdapterDataSetObserver(793 - 842 ))的内部类,所以,我们只要对adpater 状态的改变发送一个通知,就能让AdapterView调用相应的方法了。

DataSetObservable 的源码,记得要把其父类也看了。 https://github.com/android/platformframeworksbase/blob/master/core/java/android/database/DataSetObservable.java

现在我们就能解决我们一开始的疑问notifyDataSetChanged() 与notifyDataSetInvalidated() 具体回到AdapterView 产生什么影响?

我们对比一下onChange() 与 onInvalidated() 方法,就能对比得出,前者会对当前位置的状态进行同步,而后者会重置所有位置的状态。从代码的注释里面还可以获取得到更多的信息。

这样,我们以后调用notifyDataSetChanged()和notifyDataSetInvalidated() 就更加明白会发生什么情况了。

点击item 怎么能够获取到当前的位置

这里假设你已经打开了AdpaterView 的 593 - 615 行。。

对于getPositionForView() 这个方法,你肯定没用过,要搞明白为什么我们能够获取到adapterView 里面item view对应的位置,我们需要看 其直接子类:AbsListView.class

源码相关:(2130-2197) (2196 - 2279)

这里又用到一种设计模式:委托模式

假设你已经搞懂委托模式的概念,首先我们来看源码(2130 - 2197)。

从obtainView() 方法名中我们可以知道,这是一个用于生成itemView的方法。把这块代码看完,以后,会不会有个疑问呢(先不用管回收那块)? position 到哪里了?我们可以看到这个方法实际上并没有对我们的itemview 设置了任何的监听器,那为什么最后能对我们的itemview的动作进行反应呢?

接下来我们看:源码(2196 - 2279)

代码里面我们可以看出这是一个委托类,对item 的动作进行初始化,以及响应对应的操作,从源码里面我们可以获知得到,一个item view 为什么能对click,longclick,select 动作进行响应,然后,通过调用performItemClick() 最终把事件调用到AdapterView(292-303)的performItemClick() 里面的监听器方法.

如果,你对委托模式不熟的话,要明白这里的话,需要花点时间。

认识 AbsListView 回收机制

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...