通過重寫OnScrollListener來監聽RecyclerView是否滑動到底部
阿新 • • 發佈:2019-01-28
為了增加複用性和靈活性,我們還是定義一個介面來做監聽滾動到底部的回撥,這樣你就可以把它用在listview,scrollView中去。
OnBottomListener
package kale.com.waterfall;
/**
* @author Jack Tony
* @brief
* @date 2015/4/6
*/
public interface OnBottomListener {
public void onBottom();
}
接著,我們來重寫RecyclerView.OnScrollListener
在之後的使用中,我們就可以像下方這樣監聽回撥方法了:package kale.com.waterfall.extra.RecyclerView; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import kale.com.waterfall.OnBottomListener; /** * @author Jack Tony * @brief recyle view 滾動監聽器 * @date 2015/4/6 */ public class OnRcvScrollListener extends RecyclerView.OnScrollListener implements OnBottomListener { private String TAG = getClass().getSimpleName(); public static enum LAYOUT_MANAGER_TYPE { LINEAR, GRID, STAGGERED_GRID } /** * layoutManager的型別(列舉) */ protected LAYOUT_MANAGER_TYPE layoutManagerType; /** * 最後一個的位置 */ private int[] lastPositions; /** * 最後一個可見的item的位置 */ private int lastVisibleItemPosition; /* *//** * 是否正在載入 *//* private boolean isLoadingMore = false;*/ /** * 當前滑動的狀態 */ private int currentScrollState = 0; @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); // int lastVisibleItemPosition = -1; if (layoutManagerType == null) { if (layoutManager instanceof LinearLayoutManager) { layoutManagerType = LAYOUT_MANAGER_TYPE.LINEAR; } else if (layoutManager instanceof GridLayoutManager) { layoutManagerType = LAYOUT_MANAGER_TYPE.GRID; } else if (layoutManager instanceof StaggeredGridLayoutManager) { layoutManagerType = LAYOUT_MANAGER_TYPE.STAGGERED_GRID; } else { throw new RuntimeException( "Unsupported LayoutManager used. Valid ones are LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager"); } } switch (layoutManagerType) { case LINEAR: lastVisibleItemPosition = ((LinearLayoutManager) layoutManager) .findLastVisibleItemPosition(); break; case GRID: lastVisibleItemPosition = ((GridLayoutManager) layoutManager) .findLastVisibleItemPosition(); break; case STAGGERED_GRID: StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager; if (lastPositions == null) { lastPositions = new int[staggeredGridLayoutManager.getSpanCount()]; } staggeredGridLayoutManager.findLastVisibleItemPositions(lastPositions); lastVisibleItemPosition = findMax(lastPositions); break; } } @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); currentScrollState = newState; RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); int visibleItemCount = layoutManager.getChildCount(); int totalItemCount = layoutManager.getItemCount(); if ((visibleItemCount > 0 && currentScrollState == RecyclerView.SCROLL_STATE_IDLE && (lastVisibleItemPosition) >= totalItemCount - 1)) { //Log.d(TAG, "is loading more"); onBottom(); } } @Override public void onBottom() { //Log.d(TAG, "is onBottom"); } private int findMax(int[] lastPositions) { int max = lastPositions[0]; for (int value : lastPositions) { if (value > max) { max = value; } } return max; } }
waterFallRcv.setOnScrollListener(new OnRcvScrollListener(){ @Override public void onBottom() { super.onBottom(); // 到底部自動載入 if (!isLoadingData){ Log.d(TAG, "loading old data"); adapter.loadOldData(); isLoadingData = true; } } });