package mcxtzhang.recyclerviewdemo.generalizerv.base; 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 android.util.Log; /** * 介绍:RecyclerView的滑动监听器,当滑动到底部(Last)触发回调 * 这个类仅做监听器作用,只要last 可见就不停的回调, * 实现它的类,应该在onLastItemVisible()这个方法里,去除重复的回调。 * 作者:zhangxutong * 邮箱:zhangxutong@imcoming.com * 时间: 2016/10/31. */ public abstract class OnScrollToLastListener extends RecyclerView.OnScrollListener { public static final String TAG = "zxt/ScrollListener"; public abstract void onLastItemVisible(); @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); int itemCount = recyclerView.getAdapter().getItemCount(); int lastVisibleItemPosition = -1; RecyclerView.LayoutManager lm = recyclerView.getLayoutManager(); if (dy > 0 || dx > 0) { if (lm instanceof GridLayoutManager) { GridLayoutManager gLm = (GridLayoutManager) lm; lastVisibleItemPosition = gLm.findLastVisibleItemPosition(); Log.d(TAG, "onScrolled() called with: findLastVisibleItemPosition = [" + gLm.findLastVisibleItemPosition() + ", itemCount = [" + itemCount + "]"); } else if (lm instanceof LinearLayoutManager) { LinearLayoutManager lLm = (LinearLayoutManager) lm; lastVisibleItemPosition = lLm.findLastVisibleItemPosition(); Log.d(TAG, "onScrolled() called with: findLastVisibleItemPosition = [" + lLm.findLastVisibleItemPosition() + ", itemCount = [" + itemCount + "]"); } else if (lm instanceof StaggeredGridLayoutManager) { StaggeredGridLayoutManager sGLm = (StaggeredGridLayoutManager) lm; int spanCount = sGLm.getSpanCount(); int[] lastVisibleItemPositions = sGLm.findLastVisibleItemPositions(null); lastVisibleItemPosition = lastVisibleItemPositions[spanCount - 1]; Log.d(TAG, "onScrolled() called with: spanCount = [" + spanCount + ", lastIndex = [" + lastVisibleItemPositions[spanCount - 1] + "]" + ", itemCount = [" + itemCount + "]"); } } if (lastVisibleItemPosition == itemCount - 1) {//下标会少一位的 onLastItemVisible(); } } }