背景
最近在公司的項目中要使用到ListView的下拉刷新和上拉加載更多(貌似現在是個項目就有這個功能!哈哈),其實這個東西GitHub上很多,但是我感覺那些框架太大,而且我這個項目只用到了ListView沒有用到其他的,所以我就想自己寫一個吧!
(注:本篇文章高手就自動略過吧!!!!)
一.實現步驟
- 自定義View繼承ListView
- 向ListView添加頭部View和尾部View(還有人不知道嗎?哈哈)
- 隱藏頭部View和尾部View (這個地方有個坑,我在代碼介紹的時候會注明)
- 重寫onTouchEvent()方法 (這個地方注意點很多 要不然運行的時候 會出現很多細節上的問題)
二.代碼實現
終於到了寫代碼的時候啦!!我們按照上面的步驟一步一步的來
1.自定義View繼承ListView 同時也要繼承 AbsListView.OnScrollListener 因為要我們要記錄ListView的狀態.上代碼:
2.向ListView添加頭部View和尾部View 這里如果直接調用view的getMeasuredHeight()方法來獲取view的高度的話,你就會發這個這個高度值為0,所以我們在調用之前應該先執行下面段代碼:
得到view高度之后 就可以獲取到頭部View和尾部view的高度啦!在看代碼:
3.隱藏頭部View和尾部View 這一步在第二部的代碼片段中已經實現啦!就是設置兩個View的paddingTop值 注意是負的啊 要不然不能隱藏哦!
4.重寫onTouchEvent()方法 重頭戲來啦!
1.首先我們再來分析一下 下拉刷新的過程:
(1).用戶沒有任何操作
(2).用戶在在下拉
(3).下拉一定距離 提示用戶松開刷新
(4).正在刷新
(5).刷新完成-->(1)
至此我們知道了總共用四中狀態!我們可以用四個靜態常亮來表示。當然,我們也因該定義個變量表示當前的狀態 默認當然是無狀態啦!!!看代碼:
- 分析完狀態之后,我們還需注意幾點小問題:就是我們在什么時候才能下拉刷新呢?(大家好好想想!!) 就是當前頁面中出現我們ites中的第一個(就是ListView顯示列表中的第一個),此時下來才是有效的!!那怎么才知道當前頁面中的第一個是ListView列表中的第一個呢?其實很簡單 在繼承ListView的時候我們繼承了AbsListView.OnScrollListener這個回調接口!該接口有兩個!我們先看其中一個回調方法
代碼中注釋很清楚 我就不說明了!!
3.至此,我們就要開始寫最核心的部分了(請大家睜大雙眼)
(1).首先我們的第一步操作就是按下屏幕 此時當然觸發Acion_Down啦。此時就是我們判斷當前頁面的第一個是否是ListView列表中的第一個啦 如果是的 我們設置個標志位記錄下。同時呢 我們也得記錄下按下去的X Y值。看代碼
(2).下面就是開始向下滑動了 這里我直接上代碼(有注釋 不要擔心看不懂。如果看不懂就多看幾遍!!哈哈)
代碼略長分了兩段上傳:
仔細的看的人可以能要問了。這兩個函數setHeaderViewTopPadding()和updateHeadView()是什么鬼!其實看名字就知道啦!第一個是用來更新view的paddingtop值的!第二個是用來更新View的內容的!
4.最后一步啦 當用戶松開手指的時候:其實很好判斷 :無非就是判斷當前狀態是什么 如果是 PULLTOREALSE 松開就是刷新 不是的話就恢復出事狀態。看代碼:
至此 本篇博客就要結束啦!可以有人要說了你騙人 !還有上拉加載更多呢?其實這個比下拉刷新簡單的太多了!我就不貼代碼了!!!大家自己去摸索吧!!
附上代碼下載鏈接