private static int findFirstVisibleItemPositionIncludesPadding(LinearLayoutManager lm) { final View child = findOneVisibleChildIncludesPadding(lm, 0, lm.getChildCount(), false, true); return child == null ? RecyclerView.NO_POSITION : lm.getPosition(child); }
private static int findLastVisibleItemPositionIncludesPadding(LinearLayoutManager lm) { final View child = findOneVisibleChildIncludesPadding(lm, lm.getChildCount() - 1, -1, false, true); return child == null ? RecyclerView.NO_POSITION : lm.getPosition(child); }
private int findFirstVisibleItemPosition(RecyclerView recyclerView) { final View child = findOneVisibleChild(0, mLayoutManager.getChildCount(), false, true); return child == null ? RecyclerView.NO_POSITION : recyclerView.getChildAdapterPosition(child); }
@Override public void onScrolled(androidx.recyclerview.widget.RecyclerView recyclerView, int dx, int dy) { int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition(); if (!isLoading() && !isLastPage()) { if (layoutManager.getChildCount() + firstVisibleItemPosition >= layoutManager.getItemCount()) loadNextPage(); } }
/** * Checks if more items can be loaded to the RecyclerView * * @return boolean Returns true if can load more items or false if not. */ protected boolean canLoadMoreItems() { final int visibleItemsCount = layoutManager.getChildCount(); final int totalItemsCount = layoutManager.getItemCount(); final int pastVisibleItemsCount = layoutManager.findFirstVisibleItemPosition(); final boolean lastItemShown = visibleItemsCount + pastVisibleItemsCount >= totalItemsCount; return lastItemShown && totalItemsCount >= maxItemsPerRequest; }
@Test public void testCanLoadMoreItemsShouldBeFalse() { // given int visibleItemsCount = 10; int totalItemsCount = 30; int pastVisibleItemsCount = 15; int itemsPerRequest = 100; InfiniteScrollListener listener = createListener(manager, itemsPerRequest); // when when(manager.getChildCount()).thenReturn(visibleItemsCount); when(manager.getItemCount()).thenReturn(totalItemsCount); when(manager.findFirstVisibleItemPosition()).thenReturn(pastVisibleItemsCount); boolean canLoadMoreItems = listener.canLoadMoreItems(); // then assertThat(canLoadMoreItems).isFalse(); }
@Test public void testCanLoadMoreItemsShouldBeTrue() { // given int visibleItemsCount = 10; int totalItemsCount = 20; int pastVisibleItemsCount = 15; int itemsPerRequest = 10; InfiniteScrollListener listener = createListener(manager, itemsPerRequest); // when when(manager.getChildCount()).thenReturn(visibleItemsCount); when(manager.getItemCount()).thenReturn(totalItemsCount); when(manager.findFirstVisibleItemPosition()).thenReturn(pastVisibleItemsCount); boolean canLoadMoreItems = listener.canLoadMoreItems(); // then assertThat(canLoadMoreItems).isTrue(); }
@Test public void testCanLoadMoreItemsLogicIsCorrect() { // given int visibleItemsCount = 10; int totalItemsCount = 150; int pastVisibleItemsCount = 20; int itemsPerRequest = 100; InfiniteScrollListener listener = createListener(manager, itemsPerRequest); // when when(manager.getChildCount()).thenReturn(visibleItemsCount); when(manager.getItemCount()).thenReturn(totalItemsCount); when(manager.findFirstVisibleItemPosition()).thenReturn(pastVisibleItemsCount); boolean lastItemShown = visibleItemsCount + pastVisibleItemsCount > totalItemsCount; boolean canLoadMoreItemsExpected = lastItemShown && totalItemsCount >= itemsPerRequest; boolean canLoadMoreItems = listener.canLoadMoreItems(); // then assertThat(canLoadMoreItems).isEqualTo(canLoadMoreItemsExpected); }