在項目中需要支持刷新加載功能,如果你牛逼,你完全可以直接自己寫一個自定義的控件,支持刷新,如果你是菜鳥,呵呵呵。。。那就用框架吧,其實框架就是別人寫好的代碼,提供了一種解決方法,我們只需要知道如何使用它,把數據放進去,獲取。。。當然,有時間你可以看源碼,大神是如何實現的。。。
框架是大神寫的,但是大神也是人,也會有犯錯的時候,可能錯誤不大,但是我們寫項目就不能犯錯,要不然老闆幹你。。。滾蛋。。。
在集成開源框架android-pulltorefesh,發現存在很多bug以及一些不滿好的設計,做個總結吧,請不要吐槽。。。
導入項目:
https://github.com/chrisbanes/Android-PullToRefresh
這個項目比較老了,
README.md Update README to notify you of me no longer maintaining project 4 years ago
最近一次修改在4年前。
所以項目是ecplice做的,用ecplice導入。
4個文件:
library 庫,最重要的
PullToRefreshListFragment 庫 (依賴library)
PullToRefreshViewPager 庫(依賴library)
LauncherActivity_sample 啓動項目,需要上面3個庫
ecplice導入有的時候報錯,提示override
在實際應用中應該注意的一點就是:
在eclipse中,compiler 都得設置到1.6。這包括preference->Java->compiler 下要改成1.6, 同時,project裏的build path 裏jdk 也得改成1.6。 這主要是針對同時裝了1.5, 1.6,而default is 1.5這種情況的。
http://blog.csdn.net/lxzo123/article/details/6451265
1、目前支持的view
ListView
ExpandableListView
GridView
WebView
ScrollView
HorizontalScrollView
ViewPager
沒有RecycleView,蛋疼,如果項目需要,你可以自己寫一個,模仿GridView。。。
2、發現的下拉刷新bug
1)
步驟:
PullToRefreshListView 下
設置支持同時支持上拉和下拉模式(設置圖標旋轉rotate),下拉刷新狀態中在
沒有刷新結束時將listview快速滑動到下面,不斷的上拉。這個時候再滑動到 頭部會發現一直在刷新,永遠不會停止,除非你重新(上拉或者下拉)刷新,纔會停止!!!
我的解決方法:
如果你項目要支持上拉下拉刷新,代碼裏面在上拉刷新時候,重新設置模式爲只支持上拉,
在下拉時候,代碼設置只支持下拉,
在刷新結束時候,重置,支持 上拉下拉刷新。
核心:
主要就是在一個刷新狀態下(下拉),只有刷新結束,纔可以再次另一種方式刷新(對應上拉)。
2)
設置圖標旋轉rotate模式,下拉刷新,再往上滑動,刷新view消失,再往下滑動,發現華爲mate8手機下,rotate旋轉圖標不轉動,停止了,就是說沒有動畫!!!
我的解決方法:rotate 旋轉是用代碼寫的,可以修改庫bug。
或者使用另一個動畫效果,箭頭,那這個旋轉應該是xml寫的旋轉,不存在問題。
3)
刷新狀態無法關閉,一直在刷新。。。
網上解決方案延遲執行刷新完成操作,太快了執行onRefreshComplete無效,真特麼無語。。。
解決方法:
PullToRefreshListView 實現下拉或者上拉加載時候,可能在上拉 完成時候,調用onRefreshComplete方法去
停止 刷新操作,但是,可能無效,測試產生原因,刷新獲取數據時候,時間太短,就會出現該問題
我們可以 延遲 1秒左右,在調用onRefreshComplete 方法,可以解決該問題
mListView.postDelayed(new Runnable() {
@Override
public void run() {
mListView.onRefreshComplete();
}
}, 1000);
記得是在 setadpter後面執行,不然 無效
源碼:
@Override
protected String[] doInBackground(Void... params) {
// Simulates a background job.
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
}
return mStrings;
}
你特麼延遲了4s,見鬼。。。
4)
web、gridview、scrollview (好像只有除了listview)。。。
mPullRefreshScrollView.setScrollingWhileRefreshingEnabled(true);
設置刷新時,支持滑動。但是發現滑動時候 頭部或者底部刷新view還在,尼瑪,屏幕本來就小,爲什麼不隱藏???
設置無效,只有
ptrListViewExtrasEnabled
針對 listview才起效果!!!!
5)
使用PullToRefreshListView 獲取count 遇到的坑!!!!
favorite_listview = (PullToRefreshListView) findViewById(R.id.favorite_listView);
favorite_listview.setScrollingWhileRefreshingEnabled(true);
//刷新分頁
favorite_listview.setMode(PullToRefreshBase.Mode.BOTH);
listview = favorite_listview.getRefreshableView();
發現listview中的 item
=0時候,count=0;
有1條的時候,
listview.getCount()打印
log
06-21 18:26:23.489 19267-19267/? D/FavoriteActivity: FavoriteActivity—listview—3 ;
2條—listview.getCount() =4 ;
那麼代碼設計應該是獲取listview的count=0,
把頭部、底部刷新view加載外層,不在listview中!!!
如果count>0,
把頭部、底部分別加載
listview的第一行 和 最後一行(這就是爲什麼size多2個的原因,並且即使清空了listview.clear( ),頭尾也不消失)
android.widget.FrameLayout:
頭刷新view
FavoriteActivity—listview—android.widget.FrameLayout{ba1807c V.E…… ……ID 0,0-1062,0}
06-21 18:53:16.565 28916-28916/? D/FavoriteActivity: FavoriteActivity—listview—android.widget.LinearLayout{4d1ad05 V.E….L. …….. 0,0-1062,414 #7f0f0065 app:id/list_item}
尾部刷新view
06-21 18:53:16.566 28916-28916/? D/FavoriteActivity: FavoriteActivity—listview—android.widget.FrameLayout{6dc615a V.E…… ……ID 0,414-1062,414}
…….
解決方法:
模仿PullToRefreshListView,應該可以實現gridview刷新隱藏頭部view
,後期試試吧~~~
框架可能還有其他問題,反正就是用到真正項目中,有很多問題出現,需要修復。。。
改啊。。。
3、各種屬性設置(繁瑣,草)
常用的一些屬性:
ptr:ptrMode="both"
設置上拉和下拉都支持。
可選值爲:disabled(禁用下拉刷新),
pullFromEnd(僅支持上拉刷新),
both(二者都支持), manualOnly(只允許手動觸發)
也可以使用代碼設置,在onCreate裏面寫:mPullRefreshListView.setMode(Mode.BOTH);//設置你需要的模式
設置圖標
ptr:ptrDrawable="@drawable/ic_launcher"
設置下拉時候圖標的動畫
ptr:ptrAnimationStyle="flip" 倒置、ptr:ptrAnimationStyle="rotate"旋轉
ptrRefreshableViewBackground
設置整個mPullRefreshListView的背景色
ptrHeaderBackground
設置下拉Header或者上拉Footer的背景色
ptrHeaderTextColor
用於設置Header與Footer中文本的顏色
ptrHeaderSubTextColor
用於設置Header與Footer中上次刷新時間的顏色
ptrShowIndicator
如果爲true會在mPullRefreshListView中出現icon,
右上角和右下角,看着蛋疼。。。
ptrHeaderTextAppearance ,
ptrSubHeaderTextAppearance
分別設置拉Header或者上拉Footer中字體的類型顏色等等。
ptrRotateDrawableWhilePulling
當動畫設置爲rotate時,下拉時候是否旋轉。
這個無法理解,搞不清,rotate就是讓他旋轉,
你特麼還設置不轉???
ptrScrollingWhileRefreshingEnabled
刷新的時候,是否允許ListView或GridView滾動
ptrListViewExtrasEnabled
決定了Header,Footer以何種方式
加入mPullRefreshListView,
true爲headView方式加入,
就是滾動時刷新頭部會一起滾動,
就是所刷新的view會隱藏,但是
這個只針對ListView有效果。
4、
想自定義刷新的view,使用自己的layout.xml,這個貌似無法實現,除非直接修改library,框架寫死了佈局,只給了
設置圖標、
提示文字這些方法、字體等方法。