下拉刷新ListView的實現原理

本文主要介紹如何實現相似新浪微博客戶端下拉刷新效果的ListView。關於其使用見下拉刷新ListView的使用java

 

示例APK地址:TrineaAndroidDemoandroid

 

首先讓咱們看下效果git

四張圖分別爲第一次下拉、第一次釋放、第一次刷新中、第二次下拉的效果,其中的文本能夠設置,能夠下載Demo代碼DropDownListViewDemo編譯運行。下面看如何使用實現github

 

一、源代碼app

DropDownListView.java,其中註釋明確。函數

項目地址見TrineaAndroidCommon@Github google

 

二、原理spa

經過對ListView添加了一個刷新layout(源代碼res/layout/drop_down_to_refresh_list_header.xml)做爲header,在滾動中時不斷改變header的高度和內容並記錄一些狀態,在用戶手指離開屏幕時根據狀態決定進行刷新仍是放棄刷新.net

 

主要是經過重寫ListView的onTouchEvent和OnScrollListener的onScrollStateChanged、onScroll函數實現xml

先介紹下刷新狀態共有四種,以下:

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可見

相關文章
相關標籤/搜索