关于RecyclerView的加载更多(重写RecyclerView.OnScrollListener),网上广泛有两种写法,来分析下两种写法的优劣: 1. 第一种,代码以下,这种方法的原理是当RecyclerView持有的Item数量减去可见的Item数量后数目小于等于第一个可见Item,那么列表就是能够调用onLoadMore这个方法的,看上去颇有道理,假如手机一屏刚好是四个Item都显示出来了,这个时候itemCount和previousItemCount是相等的,这个时候isRefreshing恒等于false,因此不管如何都是不会调用onLoadMore的.ide
/** * 用于RecyclerView加载更多的监听器 */ public abstract class OnLoadMoreListener extends RecyclerView.OnScrollListener { private int lastVisibleItem; private int itemCount;//全部的Item个数 private int visibleItemCount;//可见Item的个数 private int firstVisibleItem;//第一个可见的Item 的position private int previousItemCount;//滑动以前的Item数目 private boolean isRefreshing = true; /** * 重写此抽象方法,实现加载更多 */ protected abstract void onLoadMore(); @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); itemCount = getLayoutManager().getItemCount(); visibleItemCount = recyclerView.getChildCount(); if (getLayoutManager() instanceof LinearLayoutManager) { firstVisibleItem = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition(); } if (isRefreshing) { if (itemCount > previousItemCount) { isRefreshing = false; previousItemCount = itemCount; } } if (!isRefreshing && (itemCount - visibleItemCount) <= firstVisibleItem) { onLoadMore();//加载更多的逻辑写在这个方法里,好比请求数据 isRefreshing = true; } } }
2. 第二种,代码以下,原理就是当RecyclerView中止滑动的时候,判断最后一个Item的Position+1是否等于Item的总数量,是就下拉加载更多,这种的话,我的认为是比较合理的加载更多的写法:
private class OnLoadMoreListener extends RecyclerView.OnScrollListener{ private int lastVisibleItem; private int itemCount; @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE){ if (lastVisibleItem + 1 == itemCount && newState == RecyclerView.SCROLL_STATE_IDLE){ onloadMore(); } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); lastVisibleItem = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastVisibleItemPosition(); itemCount = recyclerView.getAdapter().getItemCount(); } }