public static int findFirstVisibleItemPosition(@NonNull RecyclerView rv, boolean includesPadding) { RecyclerView.LayoutManager layoutManager = rv.getLayoutManager(); if (layoutManager instanceof LinearLayoutManager) { if (includesPadding) { return findFirstVisibleItemPositionIncludesPadding((LinearLayoutManager) layoutManager); } else { return (((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition()); } } else { return RecyclerView.NO_POSITION; } }
@Override public void onScrolled(final RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); visibleItemCount = recyclerView.getChildCount(); totalItemCount = linearLayoutManager.getItemCount(); firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition(); if (loading) { if (totalItemCount > previousTotal || totalItemCount == 0) { loading = false; previousTotal = totalItemCount; } } // End has been reached if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) { currentPage++; recyclerView.post(loadMore); loading = true; } }
@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(); } }
int firstChild = ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition();
firstVisiblePosition = ((LinearLayoutManager) mRecyclerView.getLayoutManager()).findFirstVisibleItemPosition(); } else if (mRecyclerView.getLayoutManager() instanceof GridLayoutManager) { firstVisiblePosition = ((GridLayoutManager) mRecyclerView.getLayoutManager()).findFirstVisibleItemPosition();
public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (this.mLayoutManager == null) { this.mLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); } if (mVisibleThreshold == -1) { mVisibleThreshold = findLastVisibleItemPosition(recyclerView) - findFirstVisibleItemPosition(recyclerView); } mVisibleItemCount = recyclerView.getChildCount(); mTotalItemCount = mLayoutManager.getItemCount(); mFirstVisibleItem = findFirstVisibleItemPosition(recyclerView); mTotalItemCount = mAdapter.getItemCount(); if (mLoading) { if (mTotalItemCount > mPreviousTotal) { mLoading = false; mPreviousTotal = mTotalItemCount; } } if (!mLoading && mLayoutManager.findFirstVisibleItemPosition() - mVisibleThreshold <= 0) { mCurrentPage++; onLoadMore(mCurrentPage); mLoading = true; } else { if (isNothingToLoadFeatureEnabled() && isNothingToLoadNeeded()) { onNothingToLoad(); mAlreadyCalledOnNoMore = true; } } }
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // Save the thread ID if (thread != null) { outState.putString(InterfaceManager.THREAD_ENTITY_ID, thread.getEntityID()); } // Save the list position outState.putInt(LIST_POS, layoutManager().findFirstVisibleItemPosition()); }
public int getScrollPosition() { return mLayoutManager.findFirstVisibleItemPosition(); }
private int findFirstVisibleItemPosition(@NonNull final RecyclerView.LayoutManager layoutManager) { if (layoutManager instanceof LinearLayoutManager) { return ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition(); } else if (layoutManager instanceof StaggeredGridLayoutManager) { return ((StaggeredGridLayoutManager) layoutManager).findFirstVisibleItemPositions(null)[0]; } return 0; }
private void updateScrollPos() { if (mRecyclerView == null) return; int itemPos = ((LinearLayoutManager) mRecyclerView.getLayoutManager()).findFirstVisibleItemPosition(); mScrollPos = itemPos; if (itemPos == -1) return; RecyclerView.ViewHolder holder = mRecyclerView.findViewHolderForAdapterPosition(itemPos); if (holder == null) return; mScrollPos -= (float) holder.itemView.getTop() / holder.itemView.getHeight(); }
/** * 展示数据的范围 */ @Override public void getItemRangeInto(@NonNull int[] outRange) { RecyclerView.LayoutManager manager = mRecyclerView.getLayoutManager(); LinearLayoutManager mgr = (LinearLayoutManager) manager; outRange[0] = mgr.findFirstVisibleItemPosition(); outRange[1] = mgr.findLastVisibleItemPosition(); }
/** * 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; }
/** * Returns the first visible grid position. * * @return the first visible position or RecyclerView.NO_POSITION if any error occurs. * @see #getFirstCompletelyVisiblePosition() */ public int getFirstVisiblePosition() { LayoutManager lm = getLayoutManager(); if (lm instanceof LinearLayoutManager) { LinearLayoutManager llm = (LinearLayoutManager) lm; return llm.findFirstVisibleItemPosition(); } else { StaggeredGridLayoutManager sglm = (StaggeredGridLayoutManager) lm; if (sglm == null) { return NO_POSITION; } int[] firstVisibleItemPositions = sglm.findFirstVisibleItemPositions(null); Arrays.sort(firstVisibleItemPositions); return firstVisibleItemPositions[0]; } }
@Override protected Parcelable onSaveInstanceState() { SavedState savedState = new SavedState(super.onSaveInstanceState()); savedState.mFile = mFile; savedState.mPosition = mLayoutManager != null ? mLayoutManager.findFirstVisibleItemPosition() : -1; savedState.mHighlightTabs = mHighlightTabs; savedState.mHighlightTrailingWhitespaces = mHighlightTrailingWhitespaces; savedState.mHighlightIntralineDiffs = mHighlightIntralineDiffs; savedState.mCanEdit = mCanEdit; savedState.mDiffMode = mDiffMode; savedState.mDrafts = SerializationManager.getInstance().toJson(mDrafts); savedState.mShowBlameA = mShowBlameA; savedState.mShowBlameB = mShowBlameB; return savedState; }
/** * 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()); } }
@Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); int visibleItemCount = recyclerView.getChildCount(); int totalItemCount = mLinearLayoutManager.getItemCount(); int firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition(); if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + VISIBLE_THRESHOLD)) { // End has been reached onLoadMore(totalItemCount); loading = true; } }
@Override public void onScrollStateChanged(@NonNull final RecyclerView recyclerView, final int newState) { if (newState == SCROLL_STATE_IDLE) { // if idle load images for all visible items mScrollSpeed = 0; mAdapter.setScrollSpeed(0); final RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); if (layoutManager instanceof LinearLayoutManager) { final int firstVisibleItemPosition = ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition(); final int lastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition(); // just return if the recyclerview has no data if (firstVisibleItemPosition == RecyclerView.NO_POSITION || lastVisibleItemPosition == RecyclerView.NO_POSITION) { return; } final int visibleItemCount = lastVisibleItemPosition - firstVisibleItemPosition; for (int i = 0; i <= visibleItemCount; i++) { GenericImageViewItem item = (GenericImageViewItem) recyclerView.getChildAt(i); item.startCoverImageTask(); } } } }
@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); }
@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(); }