RecyclerView源码解析
RecyclerView源码解析RecyclerView 可以让您轻松高效地显示大量数据。您提供数据并定义每个列表项的外观,而 RecyclerView 库会根据需要动态创建元素。
顾名思义,RecyclerView 会回收这些单个的元素。当列表项滚动出屏幕时,RecyclerView 不会销毁其视图。相反,RecyclerView 会对屏幕上滚动的新列表项重用该视图。这种重用可以显著提高性能,改善应用响应能力并降低功耗。
详细使用方法请参照开发者文档😃
关键类类定义1234public class RecyclerView extends ViewGroup implements ScrollingView, NestedScrollingChild2, NestedScrollingChild3 { ... }
可以看出RecyclerView继承于ViewGroup,本身也是一个自定义View,实现了ScrollingView等接口。
绘制过程本质上是自定义View,则有onMeasure、onLayout、onDraw三步绘制 ...
java泛型
泛型程序设计什么是泛型程序设计?泛型程序设计(generic programming)是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。Ada、Delphi、Eiffel、Java、C#、F#、Swift 和 Visual Basic .NET 称之为泛型(generics);ML、Scala 和 Haskell 称之为参数多态(parametric polymorphism);C++ 和 D称之为模板。具有广泛影响的1994年版的《Design Patterns》一书称之为参数化类型(parameterized type)。
为什么要使用泛型程序设计?
泛型编程可以实现通用算法
在有泛型类之前,泛型程序设计是用继承实现的。程序员必须使用Object编写使用于多种类型的代码,这很繁琐,也很不安全。
通过使用泛型,程序员可以实现通用算法,这些算法可以处理不同类型的集合,可以自定义,并且类型安全且易于阅读。泛型程序设计意味着编写的代码可以对多种不同 ...
View的工作流程
View的工作流程指的就是measure、layout和draw。其中measure用来测量VIew的宽和高,layout用来确定View的位置,draw用来绘制View。
Acitivity启动过程startActivityForResult方法先从Activity的startActivity方法说起。
startActivity方法或startActivityForResult有很多种重载方式,但它们最终都会调用startActivityForResult(intent, requestCode, options)方法。源码如下:
1234567891011121314151617181920212223242526272829303132public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle options) { //如果是第一次启动,则成员变量mParent为空,否则不为空。 ...
Android多线程
Android沿用了java的线程模型。
View的滑动冲突
我们在完成android需求时,可能会遇到多种控件同时可以滑动的场景,这时就可能会出现滑动冲突。在学习完android事件的分发机制之后,我们来学习滑动冲突的处理办法。
基础
常见的滑动冲突场景
场景一:外部滑动方向和内部不一致。
场景二:外部滑动方向和内部一致。
场景三:以上两种情况的嵌套。
场景一的应用场景示例:ViewPager和Fragment的配合。(ViewPager内部处理了滑动冲突)
场景二的应用场景示例:SrollerView里嵌套ListView。
处理规则场景1因为内外两层的滑动方向不一致,所以当用户进行外层滑动时,需要让外部的View拦截点击事件,当用户进行内层的滑动时,需要让内部View拦截点击事件。这时我们可以根据滑动的特征来解决滑动冲突。即根据滑动的方向来判断拦截事件的View。
这个问题就变得很简单了——我们可以根据滑动过程中两个点的坐标来得出滑动的方向。
例如:
水平方向和竖直方向的距离差
滑动路径和水平方向形成的夹角
水平和竖直方向的速度差
场景2这个场景无法根据场景一的判断条件来做出判断,但我们一般能在业务 ...
后缀表达式及计算
后缀表达式概念与表示对表达式的记法前缀表达式、中缀表达式、后缀表达式(逆波兰式)它们都是对表达式的记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。后缀表达式又称逆波兰式是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式形式,不需要括号来标识操作符的优先级。
举例:
(3 + 4) × 5 - 6 就是中缀表达式- × + 3 4 5 6 前缀表达式3 4 + 5 × 6 - 后缀表达式
为何使用后缀表达式?中缀表达式是人们常用的算术表示方法。虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单。
中缀到后缀的表示转化规则需要分配2个栈,一个作为临时存储运算符的栈S1(含一个结束符号),一个作为存放结果(逆波兰式)的栈S2(空栈),S1栈可先放入优先级最低的运算符#,注意,中缀式应以此最低优先级的运算符结束。可指定其他字符,不一定非#不可。从中缀式的左端开 ...