下拉刷新,滑動到底部加載更多是App中很常見的功能缺前,github上也有很多這樣的開源庫提供這樣的功能会放,但大多數(shù)是在listview,recycleview等列表類上面做了一層包裝盖腿,后來google推出了官方的刷新組件SwipeRefreshLayout,SwipeRefreshLayout是Android開發(fā)功常用的一個組件,使用起來很方便愈捅,但是沒有加載更多這個功能遏考,是否可以對SwipeRefreshLayout做些改動,使其能夠支持加載更多呢蓝谨,答案是肯定的灌具。
首先對SwipeRefreshLayout進(jìn)行分析:
public class SwipeRefreshLayout extends ViewGroup implements NestedScrollingParent,
NestedScrollingChild
- 可以看到SwipeRefreshLayout實(shí)現(xiàn)了NestedScrollingParent,NestedScrollingChild這兩個接口,這兩個接口是實(shí)現(xiàn)組件之間協(xié)同滑動的重要接口譬巫,使用也不麻煩主要用到NestedScrollingParentHelper 咖楣,NestedScrollingChildHelper這兩個幫助類。
- 對于不支持NestedScrolling的view SwipeRefreshLayout采用攔截滑動事件缕题,判斷是否需要刷新截歉。
-
刷新的動畫則是一個圓形的ImageView加一個圓形的progressDrawable,通過一系列的Animation完成的,這部分代碼可以拷貝出來直接使用烟零。
有了大概思路之后就可以開始寫代碼了
- 新建類繼承ViewGroup,并實(shí)現(xiàn)NestScrollingParent,NestScrollingChild
- 在NestScrollingParent和onInterceptTouchEvent中對用戶的手勢操作做判斷瘪松。
- refresh,loadmore的顯示與消失的處理
- 數(shù)據(jù)全部加載完成咸作,沒有更多時的顯示
遇到的問題及解決辦法
fling時滑動到底部loadmore的顯示
因?yàn)橹皩iew的滑動沒有太了解,所以在判斷SwipeRefrshPlush中的子view是否滑動到底部時不知道該如何下手宵睦,最后還是賊SwipeRefreshLayout的源碼中找到了解決方法
public boolean canChildScrollDown() {
if (android.os.Build.VERSION.SDK_INT < 14) {
if (mTarget instanceof AbsListView) {
final AbsListView absListView = (AbsListView) mTarget;
int count = absListView.getChildCount();
int position = absListView.getLastVisiblePosition();
return (count > position + 1) || absListView.getChildAt(position).getBottom() <=absListView.getPaddingBottom();
} else {
return ViewCompat.canScrollVertically(mTarget, 1);
}
} else {
return ViewCompat.canScrollVertically(mTarget, 1);
}
}
refresh或loadmore動畫正在顯示時fragment切換導(dǎo)致重疊
這個問題在SwipeRefreshLayout中也存在记罚,不過以前一直沒發(fā)現(xiàn),導(dǎo)致這個問題出現(xiàn)的原因是ProgressDrawable中使用的是Animation動畫壳嚎,后來將ProgressDrawable中的動畫改為Animator動畫桐智,這個問題就得到了解決。