package zone.com.zrefreshlayout.loadmore; import android.support.v7.widget.RecyclerView; import android.view.View; import zone.com.zrefreshlayout.AUtils; import zone.com.zrefreshlayout.ZRefreshLayout; import static zone.com.zrefreshlayout.utils.LogUtils.log; /** * [2017] by Zone */ public class RecyclerViewLoadMoreListener implements LoadMoreOtherListener { private ZRefreshLayout zRefreshLayout; private OnScrollRecyclerViewListener mOnScrollRecyclerViewListener; @Override public void addListener(View view,ZRefreshLayout zRefreshLayout) { RecyclerView rv =(RecyclerView)view; this.zRefreshLayout=zRefreshLayout; rv.addOnScrollListener(mOnScrollRecyclerViewListener=new OnScrollRecyclerViewListener()); } @Override public void removeListener(View view) { RecyclerView rv =(RecyclerView)view; rv.addOnScrollListener(mOnScrollRecyclerViewListener); } @Override public boolean haveListener() { return mOnScrollRecyclerViewListener!=null; } @Override public boolean instanceOf(View view) { return view instanceof RecyclerView; } @Override public LoadMoreOtherListener clone_() { return new RecyclerViewLoadMoreListener(); } public class OnScrollRecyclerViewListener extends RecyclerView.OnScrollListener { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); // 只有在闲置状态情况下检查 if (newState == RecyclerView.SCROLL_STATE_IDLE) { // 如果满足允许上拉加载、非加载状态中、最后一个显示的 item 与数据源的大小一样,则表示滑动入底部 if (!isFirstItemVisible(recyclerView) && zRefreshLayout.isCanLoadMore() && AUtils.isRest(zRefreshLayout) && isLastItemVisible(recyclerView)) { log("RecyclerViewLoadMoreListener---->loadMore"); AUtils.loadMore(zRefreshLayout);// 执行上拉加载数据 } } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); } /** * 判断第一个条目是否完全可见 * * @param recyclerView * @return */ private boolean isFirstItemVisible(RecyclerView recyclerView) { final RecyclerView.Adapter<?> adapter = recyclerView.getAdapter(); // 如果未设置Adapter或者Adapter没有数据可以下拉刷新 if (null == adapter || adapter.getItemCount() == 0) { return true; } // 第一个条目完全展示,可以刷新 if (getFirstVisiblePosition(recyclerView) == 0) { return recyclerView.getChildAt(0).getTop() >=0; } return false; } /** * 获取第一个可见子View的位置下标 * * @param recyclerView * @return */ private int getFirstVisiblePosition(RecyclerView recyclerView) { View firstVisibleChild = recyclerView.getChildAt(0); return firstVisibleChild != null ? recyclerView.getChildAdapterPosition(firstVisibleChild) : -1; } /** * 判断最后一个条目是否完全可见 * * @param recyclerView * @return */ private boolean isLastItemVisible(RecyclerView recyclerView) { final RecyclerView.Adapter<?> adapter = recyclerView.getAdapter(); // 如果未设置Adapter或者Adapter没有数据可以上拉刷新 if (null == adapter || adapter.getItemCount() == 0) { return true; } // 最后一个条目View完全展示,可以刷新 int lastVisiblePosition = getLastVisiblePosition(recyclerView); if (lastVisiblePosition >= recyclerView.getAdapter().getItemCount() - 1) { return recyclerView.getChildAt(recyclerView.getChildCount() - 1).getBottom() <= recyclerView.getBottom(); } return false; } /** * 获取最后一个可见子View的位置下标 * * @param recyclerView * @return */ private int getLastVisiblePosition(RecyclerView recyclerView) { View lastVisibleChild = recyclerView.getChildAt(recyclerView.getChildCount() - 1); return lastVisibleChild != null ? recyclerView.getChildAdapterPosition(lastVisibleChild) : -1; } } }