/** * Initializes InfiniteScrollListener, which can be added * to RecyclerView with addOnScrollListener method * * @param maxItemsPerRequest Max items to be loaded in a single request. * @param layoutManager LinearLayoutManager created in the Activity. */ public InfiniteScrollListener(int maxItemsPerRequest, LinearLayoutManager layoutManager) { Preconditions.checkIfPositive(maxItemsPerRequest, "maxItemsPerRequest <= 0"); Preconditions.checkNotNull(layoutManager, "layoutManager == null"); this.maxItemsPerRequest = maxItemsPerRequest; this.layoutManager = layoutManager; }
/** * Callback method to be invoked when the RecyclerView has been scrolled * * @param recyclerView The RecyclerView which scrolled. * @param dx The amount of horizontal scroll. * @param dy The amount of vertical scroll. */ @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (canLoadMoreItems()) { onScrolledToEnd(layoutManager.findFirstVisibleItemPosition()); } }
@Test(expected = IllegalArgumentException.class) public void testShouldNotSetInfiniteScrollListenerWhenItemsPerRequestAreEqualToZero() { // given int itemsPerRequest = 0; // when createListener(manager, itemsPerRequest); // then throw an exception }
@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(expected = IllegalArgumentException.class) public void testShouldNotSetInfiniteScrollListenerWhenLayoutManagerIsNull() { // given int itemsPerRequest = 1; // when createListener(null, itemsPerRequest); // then throw an exception }
@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); }
@Test(expected = IllegalArgumentException.class) public void testShouldNotSetInfiniteScrollListenerWhenItemsPerRequestAreLowerThanZero() { // given int itemsPerRequest = -1; // when createListener(manager, itemsPerRequest); // then throw an exception }