android 列表實現下拉刷新,上拉加載更多

本來想要找一個支持下拉刷新和上拉加載更多的ListView代碼,但沒找到滿意的,大多要導入一些包,很是受不了,而且也有很多問題。

於是乾脆自己寫,一個類搞定,無需任何包。這裏我用的是GridView,GridView和ListView一樣用法,只是前者不支持設置頭部和尾部,但這裏可簡單移植成ListView。
基本原理看圖。
這裏寫圖片描述
這整一個是一個複合組件,包含頭部的下拉刷新部分,中間的GridView,和底部隱藏的上拉加載更多部分。
下拉刷新是將整一個整一個組件下移,上拉加載更多是將組件的內部空間上移,兩者移動的不同點是:前者使用了setY()方法,後者使用 scrollTo()方法。
(爲什麼要這樣?因爲這樣在佈局上實現比較簡單,或者我應該用相對佈局)
———代碼比較長,不一一寫出,先給大家列出重點難點。
難點一:平滑的滑動與回彈,能應對各種狂刷
關於滑動,我這裏使用的算法是,實時用全局變量記錄當前GridView的位置,然後用nowY-firshY,得出一個增量,然後加上GridView的初始Y。

float moveHeight = (nowY-firshY)*0.7f;//0.7f爲減速運動
PullRefreshGridView.this.setY((int) -(firshViewTop+moveHeight));

nowY在ACTION_MOVE事件裏nowY = event.getRawY();
firshViewTop在ACTION_UP裏PullRefreshGridView.this.firshViewTop = PullRefreshGridView.this.getY();
使得每次滑動都在當前位置的基礎上進行。(具體視源碼)

難點二:各種狀態的判斷,下拉中,放手回彈,加載刷新中,加載更多種等等。
直接使用各種boolean變量了,沒辦法。通過判斷GridView的位置,來判定當前狀態,下拉,拉到一定距離,變爲鬆開刷新,鬆開後回到什麼距離,觸發下拉刷新的事件,變爲正在刷新狀態,等待外部調用結束刷新的函數,將狀態設置爲初始狀態。

難點三:也是最難點,怎麼精確判斷GridView的Item滑到頂部了或者滑到底部了。
這裏只說滑到頂部判斷,底部基本相同。
結論:當0號Item到頂部的距離等於0的時候,即是滑到頂部。
這裏寫圖片描述
/**
* 獲取item到頂部的距離
* @return
*/
@SuppressLint(“NewApi”)
private int getItemTop() {
if(gv_List!=null&&gv_List.getChildCount()>0)
{
int firstVisiblePosition = gv_List.getFirstVisiblePosition() / gv_List.getNumColumns();//這裏getNumColumns是gridView每行的列數。
View c = gv_List.getChildAt(0);
if (c == null) {
return 0;
}
int top = c.getTop();
return -top + firstVisiblePosition * c.getHeight() + firstVisiblePosition * gv_List.getVerticalSpacing()
+ errorTop;
//這裏getVerticalSpacing是item的間距,errorTop是誤差值,這個值可在初始化時計算獲取,便永久不變
}
return 0;
}
接着直接判斷
if(bHead&&getItemTop()<=0)//如果Item在頂部
{
if(nowViewTop>=-boxHeadHeight)//防止反方向出界
。。。。。

示例項目裏面有具體的註釋,就先說到這裏。組件功能還不夠,特別是頭部和尾部,功能太少,不過可以直接在佈局裏添加,想要弄個好點的動畫效果應該也挺容易吧。

源碼下載地址:
百度雲鏈接:http://pan.baidu.com/s/1jHIRdQm 密碼:kmf5

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章