本文主要介紹如何實現類似新浪微博客戶端下拉刷新效果的ListView。關於其使用見下拉刷新ListView的使用。
示例APK地址:TrineaAndroidDemo
首先讓我們看下效果
四張圖分別為第一次下拉、第一次釋放、第一次刷新中、第二次下拉的效果,其中的文本可以設置,可以下載Demo代碼DropDownListViewDemo編譯運行。下面看如何使用實現
1、源代碼
見DropDownListView.java,其中注釋明確。
項目地址見TrineaAndroidCommon@Github
2、原理
通過對ListView添加了一個刷新layout(源代碼res/layout/drop_down_to_refresh_list_header.xml)作為header,在滾動中時不斷改變header的高度和內容並記錄一些狀態,在用戶手指離開屏幕時根據狀態決定進行刷新還是放棄刷新。
主要是通過重寫ListView的onTouchEvent和OnScrollListener的onScrollStateChanged、onScroll函數實現
先介紹下刷新狀態共有四種,如下:
CLICK_TO_REFRESH 點擊刷新狀態,為初始狀態
DROP_DOWN_TO_REFRESH 當刷新layout高度低於一定范圍時,為此狀態
RELEASE_TO_REFRESH 當刷新layout高度高於一定范圍時,為此狀態
REFRESHING 刷新中時,為此狀態
2.1 onTouchEvent函數
public boolean onTouchEvent(MotionEvent event)根據用戶在屏幕上的move事件,進行相應操作,如下:
ACTION_DOWN表示用戶手指剛接觸屏幕,會記錄用戶此時touch的點的y坐標,在下面調整高度時使用
ACTION_MOVE表示用戶手指正在屏幕上移動,此時會不斷調整header的高度,即下拉時刷新item部分高度的不斷變化
ACTION_UP表示用戶手指離開屏幕,此時會根據當前狀態決定是進行刷新還是放棄刷新,若刷新調用用戶設置的OnRefreshListener接口。
2.2 onScrollStateChanged函數
public void onScrollStateChanged(AbsListView view, int scrollState)
記錄listView當前的滾動狀態到currentScrollState,包括三種狀態:
SCROLL_STATE_TOUCH_SCROLL ListView正在滾動中,並且手指尚未離開屏幕
SCROLL_STATE_FLING ListView仍在滾動中,但用戶手指已經離開屏幕
SCROLL_STATE_IDLE ListView已經停止滾動
2.3 onScroll函數
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
根據listView當前的滾動狀態即currentScrollState和當前刷新的狀態不斷修改header內容顯示和刷新狀態,如下:
ListView為SCROLL_STATE_TOUCH_SCROLL狀態(按着不放滾動中)並且刷新狀態不為REFRESHING
a. 刷新對應的item可見時,若刷新layout高度超出范圍,則置刷新狀態為RELEASE_TO_REFRESH;若刷新layout高度低於高度范圍,則置刷新狀態為DROP_DOWN_TO_REFRESH。
b. 刷新對應的item不可見,重置header
ListView為SCROLL_STATE_FLING狀態(松手滾動中)
a. 若刷新對應的item可見並且刷新狀態不為REFRESHING,設置position為1的(即第二個)item可見
b. 若反彈回來,設置position為1的(即第二個)item可見