menu

JSR 310

由于DateTimeFormatter实例创建的时候相对耗时,因此需要考虑避免多次创建DateTimeFormatter实例,可以考虑编写一个工具类,用哈希表缓存pattern -> DateTimeFormatter

recycler view

FlexibleAdapter

Sticky Header 是通过一个强制性的 RecyclerView 父视图(FrameLayout) 来触发添加 Header View 到FrameLayout

事件

RecyclerView 将 Item 事件与 Adapter 分离,Flexibleadapter 有把它绑回去了。为什么,统一处理选择吗 设计给人一种太过杂乱的感觉。

而且需要设置了 OnItemClickListener ,ViewHolder 的默认 onclick 行为才会触发,比如 ExpandableViewHolder,需要为 FlexibleAdapter 设置了 OnItemClickListener 后 onClick 才能 toggleExpand

getSpanSize 的设计也很让人疑惑

position 代表哪个 Item 只有 adapter 知道,导致持有 Listener 的对象必须的拿着 Adapter 的引用,才能拿到对应的 Item 对象

列表更新

  • 差分算法比较暴力。
  • moved 检测 O(n^2) DiffUtil 也是 O(n^2)

Epoxy

利用 RecycleView 实现复杂的视图,不擅长与 expandle 和 sticky header

FastApater

collectionbindingadapter

使用 ItemBinding 来建立 VO 与 View 的关系

还是直接使用 VO 来声明 View 的关系更好呢?

Kotlin Uncovered

assert

assert 函数会先求值再判断是否开启了 assertion

spread array

vararg ,字节码是一个数组参数。spread 操作符会创建一个新的数组对象

tailrec

kotlin 没有自动尾递归优化,需要手动 tailrec 修饰函数,告诉编译器进行尾递归优化

reflection

FunctionRef(arg) ,每次调用创建一个新的 Function 实例 FunctionRef.invoke(arg) // FunctionRef.call(arg) // arg 被转成 new Object[]{arg}

PropertyRef() // same invoke PropertyRef.invoke() // call get PropertyRef.call() // 不建议 new Object[0] 额外的调用栈

by

thisRef、 KProperty

成本

  • KProperty object
  • new Kproperty[] // 1.4 只有 obeserable 才会生成
  • Lazy object
  • Synchronized value instantiation

D8 & R8

Loop

keyboard_arrow_up