HorizontalListView源码解读
[TOC]
前言
 随着RecycleView进入人们的视野,其强大的功能让人们逐渐忘记了曾经的王者”AdapterView”,但这绝不影响它对我们的吸引力,要知道当年流行的Gallery,Spinner,ListView,GridView等等都是它的孩子。
 那么,假如今天我们要在它的孩子中增加一个横向滚动控件,我们应该怎么实现呢?HorizontalListView给出了我们想要的答案。
把ListView横过来
需要什么类辅助
- Scroller - 一个平滑滚动的辅助工具,可以随时获取当前横向滚动距离,这里使用为了跟踪fling事件。 - 调用关系 - onLayout -> computerScrollOffset //获得新的滚动位置x,y。 - onFling -> fling //根据手势和速度,计算滚动距离。 
 
- GestureListener - 一个用来跟踪触摸,点击,长按事件的监听器。 - [onDown,onFling,onScrol,onSingleTapConfirm,onLongPress] 
- ListAdapter - 一个非常常见的可用于填充数据和视图的适配器。 
- EdgeEffectCompat - 一个处理两边边界动画效果的工具,在合适的时机传入距离,速度等参数进行渲染。 - [onAbsorb,onPull,onRelease] - 调用关系 - onScroll -> updateOverscrollAnimation -> onPull - dispatchDraw -> drawEdgeGlow ->[setSize,draw] - onLayout -> onAbsorb - onTouchEvent -> releaseEdgeGlow -> onRelease 
 
布局处理
| 1 | /** | 
手势处理
| 1 | private class GestureListener extends GestureDetector.SimpleOnGestureListener { | 
其他
复用机制
| 1 | //每一个Adapter的type对应一个queue,把同一个type的view插入到同一个queue中,然后通过queue的offer/poll接口进行复用 | 
- 调用关系 - setAdapter -> initializeRecycledViewCache(typeCount) -> [clear,add] 
 [fillListLeft,fillRight] -> getRecycledView -> [poll]
 removeNonVisibleChildren -> recycleView -> [offer]