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]