關於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(); } }