談談安卓中的下拉刷新,上拉加載ListView的實現
來自: http://www.jcodecraeer.com//a/anzhuokaifa/androidkaifa/2014/0729/1636.html
下拉刷新本是ios上的效果,后來在android中也大量采用,但是我一直沒有找到一個在性能和效果上都可以比肩ios的那種控件,有些控件效果不錯但是滑動不流暢,有些很流暢但是效果突兀,比如oschina的客戶端,后來看了看oschina的下拉刷新代碼,覺得他這個可以自己修改一下,自己動手修改之后才發現,一個小小的下拉刷新,上拉加載其實有很多細節難以處理,直到現在我都還沒有把oschina的控件改完美(我說的完美是美觀、自然、流暢并且api簡單,其實oschina的代碼寫的很亂),我的最終目的是要得到這樣一個listview:
1.下拉的時候有一定的阻尼效果
oschina的下拉在這點上做的最差,輕輕一拉就跑了飛遠。
2.手指不松開來回的下拉滑動速度不變,位移相同的情況下,和狀態有關的圖標與文字指示都是一一致的。
其中“位移相同的情況下,和狀態有關的圖標與文字指示都是一一致的”這一點很容易做到,但是“手指不松開來回的下拉滑動速度不變”這點不容易做到,因為一般來說下拉刷新的原理都是通過添加一個listview的headerview實現的,當headerview出現的時候,來回移動會跟listview本身的scroll滾動沖突,假如第一次下拉有阻尼效果,按住不松開,回到頂部,再次下拉的時候這個阻尼效果消失了(注意這個過程始終沒有松開)。這是絕大多數下拉刷新控件都具有的問題。
3.listview頭部提示部分的高度變化是漸進的,平滑的
很多下拉刷新控件在松開的時候一下子就跳到了刷新狀態,當刷新完成一下子又跳到了沒有頭部的狀態,這讓人感覺非常不爽。
4.下拉刷新的api應該盡可能簡單,使用起來最好和ListView本身差別不大,用戶不需要非常小心就能完美實現。
oschina的下拉刷新控件中headerview 和 footerview的布局都需要用戶自己去定義,使用起來很麻煩。
5.雖然實現了下拉刷新,但是這個功能不應該影響到listview本身的滑動性能。
記得又一個被大量使用的下拉刷新控件,忘了名字了,使用之后能明顯感覺到listview的性能下降很多,但是因為UI做的好加上還有很多其他的花哨功能,被很多app采用。
雖然我多次提到oschina在下拉刷新的處理上的不足,但是他給我們提供了實現下拉刷新listview的基本原理:重寫onTouchEvent 根據手勢位移改變listview的headerview。
在oschina的listview的基礎上我基本做到了1、3、4、5點但是第二點還做不到,也沒想好解決辦法。
但是在網上我找到一個解決了上述5點絕大多數問題的第三方控件,XListView
現在我都不知道是繼續去修補那個oschina的控件還是直接采用XListView了。。。
XListView的git地址:
https://github.com/Maxwin-z/XListView-Android/tree/master/src
效果截圖: