前言:
由于ListView基本是每個(gè)應(yīng)用都會(huì)需要用到的顯示控件,雖然現(xiàn)在很多都是用RecyclerView,但是畢竟后者是在ListView的思想上實(shí)現(xiàn)的,實(shí)現(xiàn)原理也是差不多,所以了解ListView的工作原理很重要。
首先把其相關(guān)的繼承關(guān)系列出:

這里主要分析人為拖動(dòng)Listview的時(shí)候的滑動(dòng),其中復(fù)用view也是在這個(gè)時(shí)候作用的。
既然是手動(dòng)拖動(dòng)view,所以肯定要從view的幾個(gè)touch方法入手。
從源碼可以知道,Abslistview實(shí)現(xiàn)了onTouchEvent,注意onTouchEvent方法里面,會(huì)初始化用于速度跟蹤器,

這個(gè)給后面手指抬起的時(shí)候,還要向前慣性滑動(dòng)一段距離提供數(shù)據(jù),這里先跳過。先來看手指按下的事件,在onTouchDown方法里面有一個(gè)比較重要的代碼:

CheckForTap是干嘛用的,是一個(gè)Runnable,在run方法里面,會(huì)調(diào)用view的相關(guān)的一些方法,比如設(shè)置按下效果等。同時(shí):

還會(huì)post一個(gè)Runnable,用于檢測是否是長按等。

setItemchecked就是實(shí)現(xiàn)我們多個(gè)按鈕選擇等
接下來進(jìn)入最重要的onTouchMove:


其中trackMotionScroll會(huì)通過滑動(dòng)的手勢(shì)的起始和最終的位置,判斷用戶是先上滑動(dòng)還是向下。
然后再調(diào)用:


完成每個(gè)view的位置更新。