为什么看不了ListView源码 20

做android开发时,很多类似这样的类和一些方法都看不了源码... 做android开发时,很多类似这样的类和一些方法都看不了源码 展开
 我来答
夜独行孤单
2016-04-21 · TA获得超过3460个赞
知道大有可为答主
回答量:2803
采纳率:82%
帮助的人:641万
展开全部
Listview部分源码分析
分类: 网络安全/ 漏洞分析/ 文章
Listview在android开发中算是最常用的几个控件之一,由于要应付各种不同的需求,甚至有时候是奇怪且独特的需要,使用Listview就总会遇到些奇怪的问题,但是其实都没有什么捷径,看源码是最好的办法。而与Listview相关的源码至少有一万行,涉及到AbsListview、AdapterView、ListAdapter等,这里对部分的源码做分析。下面由于代码数量比较多,只要着重看有中文注释的部分就可以了。
1.与数据adapter相关的
setAdapter()
setAdapter source code
ListAdapter是通过notifyDataSetChanged实现UI更新的,具体是怎样的呢?
先看registerDataSetObserver,因为registerDataSetObserver是接口Adapter定义的,所以需要实现该接口的类来实现,那么这里以BaseAdapter为例:
registerDataSetObserver()
registerDataSetObserver
它作用就是调用DataSetObservable的registerDataSetObserver,而该方法是在Observable定义的:
registerObserver
可见registerDataSetObserver的作用其实就是简单的把传进去的mDataSetObserver存储起来。

当调用BaseAdapter的notifyDataSetChanged时,干了什么?
notifyDataSetChanged
看mDataSetObservable.notifyChanged()方法:
notifyChanged
DataSetObserver是一个接口,所以onChanged方法干什么要看具体实现该接口的类,在Listview中,关联的observer是AdapterDataSetObserver类型的,它实现了DataSetObserver,看它的onChanged方法:
onChanged
总结一下,上面看出,notifyDataSetChanged方法的目的就是要求Listview重布局,从而实现UI的更新。
既然说到布局,那么接下来就介绍Listview的布局相关的东西。
2.Listview的布局
说到布局,毫无疑问要从onLayout这个方法开始看:
onLayout()
onLayout
onLayout的关键在于layoutChildren(),所以接下来关键要看layoutChildren:
layoutChildren()
layoutChildren
layoutChildren会根据mLayoutMode的值选用不同的方式返回一个item view,选择其中一种去介绍,这里选择fillDown,其他的其实差不多,大家可以自行研究:
fillDown()
fillDown
其实fillDown中极其简单,就是调用了一下makeAndAddView返回一个view,makeAndAddView实现的是得到一个view并把它添加到Listview中去
那么,接下来介绍makeAndAddView()方法,它的作用是获得每一个item view对象,即Listview的每一行数据
makeAndAddView

在makeAndAddView中,我们看到mRecycler对象,究竟该对象是什么,为什么可以从这个对象中获得一个item view去渲染Listview本身?
mRecycler是一个RecycleBin对象,从mRecycler的命名可以略知一二,它是一个回收器,回收什么?既然可以从里面获得view,那毫无疑问,回收的肯定有item view,那进一步看看该对象,它是Listview的item重用机制的重要对象,它是一个AbsListview的一个内部类:
RecycleBin
这个类很简单,就是一些相关的add、get之类的方法。ListView是通过该类的对象实例mRecycler缓存view,当滚动Listview时,即不可视view变成可视时,Listview就有可能使用mRecycler里面的view实现重用,而不需要重新创建一个view,避免资源的浪费。

回头看一下makeAndAddView两种获得view的方式,一个是mRecycler.getActiveView(position),一个是obtainView(position, mIsScrap),前者已经介绍,看完RecycleBin就知道,它就是重用了ActiveViews中的view,后者是怎么样的呢?
obtainView

介绍到这里,可以总结一下Listview是怎么重用item view的了:
如果数据没有变化,那么直接从ActiveViews中取到view,然后去布局,ActiveViews保存的就是当前可视的views,这种情况下相当于,缓存下来的view还是被布局会原来的位置,什么也没有变化;
如果数据变化了,那么可能会从SrapViews中去到view去完成布局,ScrapVews其实就缓存的是上一次可视的views,这种情况的好处是,即使数据已经变化了,但依然不需要去创建一个新的view,避免耗费移动设备可怜少的资源。
这里说的数据变化其中的“数据”并不是仅仅是adapter中的真实数据,而是包括:AdapterDataSetObserver中监测的数据、size的变化、view的重绘和重建、click,checked等事件的发生。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式