RecyclerView源码剖析
RecyclerView源码剖析
本人Android菜鸟一枚,很多没写博客了。言归正传,RecyclerView平时开发中用的比较多,打算试着剖析它的源码,因为白天上班,水平有限,但是坚持每天剖析更新一些,记录在博客上,欢迎指正交流。
前言
RecyclerView继承于ViewGroup,那么万变不离其中,主要的还是onMeasure、onLayout方法。onMeasure测量以及决定RecyclerView的大小,onLayout方法而是将Adapter中的Child(子View)以合适的坐标进行布局排列。onMeasure
todoonLayout
此方法将Adapter
中的Child
(子View)以合适的方法进行布局排列。RecyclerView
作为一个大量数据集合的容器展示控件,那么还是一样,我们猜想其中的每个Child
都需要调用View.layout(left,top,right,bottom)
方法对Child进行按照正确的坐标进行布局摆放。在onLayout中一层一层追踪,方法中看到了这段代码
public void layoutDecoratedWithMargins(View child, int left, int top, int right,int bottom) {final LayoutParams lp = (LayoutParams) child.getLayoutParams();final Rect insets = lp.mDecorInsets;child.layout(left + insets.left + lp.leftMargin, top + insets.top + lp.topMargin,right - insets.right - lp.rightMargin,bottom - insets.bottom - lp.bottomMargin);}
其中的参数我解释下。
child:即将展示在RecyclerView中的子view。
left:RecyclerView左边边缘的坐标,为相对坐标。注意是边缘坐标。这个坐标是测量之后的出来的。注意:在此坐标中包括了Margin以及装饰物的布局大小。
insets:装饰物的布局参数,比如我们平时通过以下代码来添加分割线,这里就是每条分割线的布局参数。
mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL_LIST));
这个我需要记录下。当为添加此分割线时候,只有bottom的值为1,其余全为0,这个1px就是分割线的高度。其实也就顺带出了DividerItemDecoration
中这段代码的作用。
@Overridepublic void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {if (mOrientation == VERTICAL_LIST) {outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());} else {outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);}}
这也就是为什么这段的outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
只设置了一个值。
快捷键
- 加粗
Ctrl + B
- 斜体
Ctrl + I
- 引用
Ctrl + Q
- 插入链接
Ctrl + L
- 插入代码
Ctrl + K
- 插入图片
Ctrl + G
- 提升标题
Ctrl + H
- 有序列表
Ctrl + O
- 无序列表
Ctrl + U
- 横线
Ctrl + R
- 撤销
Ctrl + Z
- 重做
Ctrl + Y
代码块
代码块语法遵循标准markdown代码,例如:
@requires_authorization
def somefunc(param1='', param2=0):'''A docstring'''if param1 > param2: # interestingprint 'Greater'return (param2 - param1 + 1) or None
class SomeClass:pass
>>> message = '''interpreter
... prompt'''
RecyclerView源码剖析相关推荐
- 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...
老李推荐:第14章4节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-端口转发 在初始化HierarchyViewer的实例过程中, ...
- JS魔法堂:mmDeferred源码剖析
一.前言 avalon.js的影响力愈发强劲,而作为子模块之一的mmDeferred必然成为异步调用模式学习之旅的又一站呢!本文将记录我对mmDeferred的认识,若有纰漏请各位指正,谢谢.项目请见 ...
- Kafka源码剖析 —— 网络I/O篇 —— 浅析KafkaSelector
为什么80%的码农都做不了架构师?>>> ##NioSelector和KafkaSelector有什么区别? 先说结论,KafkaSelector(org.apache.kaf ...
- Mongoose源码剖析:Introduction and Installation
引言 要剖析Mongoose的源码,首先你得知道它的一些基本情况和特性.并去使用它.本文就是介绍Mongoose是个什么东西?及如何安装和使用?这里假设你知道什么web服务器软件.web服务器使用什么 ...
- 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...
老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionPro ...
- 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1...
老李推荐:第3章3节<MonkeyRunner源码剖析>脚本编写示例: MonkeyImage API使用示例 在上一节的第一个"增加日记"的示例中,我们并没有看到日记 ...
- Mongoose源码剖析:外篇之web服务器
引言 在深入Mongoose源码剖析之前,我们应该清楚web服务器是什么?它提供什么服务?怎样提供服务?使用什么协议?客户端如何唯一标识web服务器的资源?下面我们抛开Mongoose,来介绍一个we ...
- STL源码剖析学习七:stack和queue
STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...
- 一个完整的python项目源码-一个Python开源项目-腾讯哈勃沙箱源码剖析(上)
前言 2019年来了,2020年还会远吗? 请把下一年的年终奖发一下,谢谢... 回顾逝去的2018年,最大的改变是从一名学生变成了一位工作者,不敢说自己多么的职业化,但是正在努力往那个方向走. 以前 ...
最新文章
- Zend Framework Mail通过网易免费邮箱发送邮件
- 耕耘数据,融合发展——2018年度数据科学研究院RONG教授座谈会成功举办
- 秋天六食物吃出好皮肤
- eclipse问题 - windows版
- python 文件末尾增加内容_java追加内容到文件末尾
- Java集合:Hashtable源码分析
- Ubuntu/linux 系统彻底杀死一个进程的方法
- 计算机要学打字吗,有了电脑打字,还需要练字吗?
- python优雅编程_Python优雅地可视化数据
- Git Pull Failed:Could not read from remote repository
- React Native将license修改为MIT,与React保持一致
- JAVA代码查错试题集
- Guitar Pro8(简称GTP8)打谱软件乐器乐谱的编排制作
- 45 个 Git 经典操作场景---教你如何合并代码
- Percent百分比布局用法
- 关闭vscode中的eslint语法检查
- java通过身份证号码获取出生日期、性别、年龄
- 别被别人抢走了你的时间
- 基于python的scip库使用,从基础模型到复杂模型,从一维变量到三维变量
- 终于来了!知乎中秋礼盒