ListView 的滑動(dòng)和復(fù)用分析

前言:

由于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的位置更新。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,323評(píng)論 25 708
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 14,104評(píng)論 2 59
  • 郭林大神的博客 http://blog.csdn.net/guolin_blog/article/details/...
    河里的枇杷樹閱讀 805評(píng)論 0 4
  • 一聽免費(fèi)立馬蜂擁而上的結(jié)果是浪費(fèi)了你好多的時(shí)間而不自知。 你的時(shí)間永遠(yuǎn)比錢更值錢。 現(xiàn)在的我越來越不相信免費(fèi)的東西...
    王麗燕199閱讀 576評(píng)論 1 11
  • http://www.cocoachina.com/ios/20160214/15251.html
    zhao1zhihui閱讀 179評(píng)論 0 0

友情鏈接更多精彩內(nèi)容