現在寫Android項目一般都會用到下拉創新以及上拉加載的功能,要想實現這一功能,就必須要在fragment和activity上實現Scrollable這一功能,基於這一功能,我整理了一下自己寫的接口類ScrollableHelper,主要用於爲fragment加上相應的功能,這裏開始講一下ScrollableHelper。
首先定義一個接口,用於得到fragment所包含的的view包括ScrollView/ListView/RecycelerView等。代碼如圖:
/**
* a viewgroup whitch contains ScrollView/ListView/RecycelerView..
*/
public interface ScrollableContainer{
/**
* @return ScrollView/ListView/RecycelerView..'s instance
*/
View getScrollableView();
}
public void setCurrentScrollableContainer(ScrollableContainer scrollableContainer) {
this.mCurrentScrollableCainer = scrollableContainer;
}
private View getScrollableView() {
if (mCurrentScrollableCainer == null) {
return null;
}
return mCurrentScrollableCainer.getScrollableView();
}
再接下來就是具體的實現判斷各種view是否處於可以滑動的狀態,以及滑動到了的狀態,即該view是否是在滑動頂部等。具體的代碼實現如下:
/**
*
* 判斷是否滑動到頂部方法,ScrollAbleLayout根據此方法來做一些邏輯判斷
* 目前只實現了AdapterView,ScrollView,RecyclerView
* 需要支持其他view可以自行補充實現
* @return
*/
public boolean isTop() {
View scrollableView = getScrollableView();
if (scrollableView == null) {
// throw new NullPointerException("You should call ScrollableHelper.setCurrentScrollableContainer() to set ScrollableContainer.");
return true;
}
if (scrollableView instanceof AdapterView) {
return isAdapterViewTop((AdapterView) scrollableView);
}
if (scrollableView instanceof ScrollView) {
return isScrollViewTop((ScrollView) scrollableView);
}
if (scrollableView instanceof RecyclerView) {
return isRecyclerViewTop((RecyclerView) scrollableView);
}
if (scrollableView instanceof WebView) {
return isWebViewTop((WebView) scrollableView);
}
throw new IllegalStateException("scrollableView must be a instance of AdapterView|ScrollView|RecyclerView");
}
private static boolean isRecyclerViewTop(RecyclerView recyclerView) {
if (recyclerView != null) {
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof LinearLayoutManager) {
int firstVisibleItemPosition = ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition();
View childAt = recyclerView.getChildAt(0);
if (childAt == null || (firstVisibleItemPosition == 0 && childAt.getTop() == 0)) {
return true;
}
}
}
return false;
}
private static boolean isAdapterViewTop(AdapterView adapterView){
if(adapterView != null){
int firstVisiblePosition = adapterView.getFirstVisiblePosition();
View childAt = adapterView.getChildAt(0);
if(childAt == null || (firstVisiblePosition == 0 && childAt.getTop() == 0)){
return true;
}
}
return false;
}
private static boolean isScrollViewTop(ScrollView scrollView){
if(scrollView != null) {
int scrollViewY = scrollView.getScrollY();
return scrollViewY <= 0;
}
return false;
}
private static boolean isWebViewTop(WebView scrollView){
if(scrollView != null) {
int scrollViewY = scrollView.getScrollY();
return scrollViewY <= 0;
}
return false;
}
@SuppressLint("NewApi")
public void smoothScrollBy(int velocityY, int distance, int duration) {
View scrollableView = getScrollableView();
if (scrollableView instanceof AbsListView) {
AbsListView absListView = (AbsListView) scrollableView;
if (Build.VERSION.SDK_INT >= 21) {
absListView.fling(velocityY);
} else {
absListView.smoothScrollBy(distance, duration);
}
} else if (scrollableView instanceof ScrollView) {
((ScrollView) scrollableView).fling(velocityY);
} else if (scrollableView instanceof RecyclerView) {
((RecyclerView) scrollableView).fling(0, velocityY);
} else if (scrollableView instanceof WebView) {
((WebView) scrollableView).flingScroll(0, velocityY);
}
}
簡單的實現的一個幫助接口,使各種view的滑動加以集成,並且使得實現下拉刷新上拉加載這一功能更加順滑,希望對大家有所幫助。