下拉刷新ListView的實現原理


本文主要介紹如何實現類似新浪微博客戶端下拉刷新效果的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可見





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM