private int findLastVisibleItemPosition(RecyclerView recyclerView) { final View child = findOneVisibleChild(recyclerView.getChildCount() - 1, -1, false, true); return child == null ? RecyclerView.NO_POSITION : recyclerView.getChildAdapterPosition(child); }
private int findLastVisibleItemPosition(RecyclerView recyclerView) { final View child = findOneVisibleChild(recyclerView.getChildCount() - 1, -1, false, true); return child == null ? RecyclerView.NO_POSITION : recyclerView.getChildAdapterPosition(child); }
private float findMaxElevation(RecyclerView recyclerView, View itemView) { final int childCount = recyclerView.getChildCount(); float max = 0; for (int i = 0; i < childCount; i++) { final View child = recyclerView.getChildAt(i); if (child == itemView) { continue; } final float elevation = ViewCompat.getElevation(child); if (elevation > max) { max = elevation; } } return max; }
/** * Returns the first item currently in the RecyclerView that is not obscured by a header. * * @param parent Recyclerview containing all the list items * @return first item that is fully beneath a header */ private View getFirstViewUnobscuredByHeader(RecyclerView parent, View firstHeader) { boolean isReverseLayout = mOrientationProvider.isReverseLayout(parent); int step = isReverseLayout ? -1 : 1; int from = isReverseLayout ? parent.getChildCount() - 1 : 0; for (int i = from; i >= 0 && i <= parent.getChildCount() - 1; i += step) { View child = parent.getChildAt(i); if (!itemIsObscuredByHeader(parent, child, firstHeader, mOrientationProvider.getOrientation(parent))) { return child; } } return null; }
@Override public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { final int childCount = parent.getChildCount(); if (childCount == 0) { return; } for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); if (!shouldDrawDropShadow(child)) { continue; } final int tx = (int) (child.getTranslationX() + 0.5f); final int ty = (int) (child.getTranslationY() + 0.5f); final int left = child.getLeft() - mShadowPadding.left; final int right = child.getRight() + mShadowPadding.right; final int top = child.getTop() - mShadowPadding.top; final int bottom = child.getBottom() + mShadowPadding.bottom; mShadowDrawable.setBounds(left + tx, top + ty, right + tx, bottom + ty); mShadowDrawable.draw(c); } }
private void processChangeEventWithDetachedView(@Nullable View detachedView, String debug) { final RecyclerView recyclerView = attachedRecyclerView; if (recyclerView != null) { // On every every events lookup for a new adapter processNewAdapterIfNecessary(); // Process the detached child if any if (detachedView != null) { processChild(detachedView, true, debug); } // Process all attached children for (int i = 0; i < recyclerView.getChildCount(); i++) { final View child = recyclerView.getChildAt(i); if (child != null && child != detachedView) { // Is some case the detached child is still in the recycler view. Don't process it as it // was already processed. processChild(child, false, debug); } } } }
@Override public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { final int childCount = parent.getChildCount();
@Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { int childCount = parent.getChildCount(); RecyclerView.LayoutManager lm = parent.getLayoutManager(); for (int i = 0; i < childCount; i++) { View child = parent.getChildAt(i); int right = (int) (lm.getDecoratedRight(child) + child.getTranslationX()); if (i == childCount - 1) { // Last item right = Math.max(right, parent.getWidth()); } // Right border c.drawRect(child.getRight() + child.getTranslationX(), 0, right, parent.getHeight(), grayBackgroundPaint); } } }
private void loadNextItemsIfNeeded(RecyclerView recyclerView) { if (!isLoading && !isError) { View lastVisibleChild = recyclerView.getChildAt(recyclerView.getChildCount() - 1); int lastVisiblePos = recyclerView.getChildAdapterPosition(lastVisibleChild); int total = getItemCount(); if (lastVisiblePos >= total - loadingOffset) { // We need to use runnable, since recycler view does not like when we are notifying // about changes during scroll callback. recyclerView.post(this::loadNextItems); } } }
private static View findRangeLastItem(RecyclerView rv, ItemDraggableRange range, int firstVisiblePosition, int lastVisiblePosition) { if (firstVisiblePosition == RecyclerView.NO_POSITION || lastVisiblePosition == RecyclerView.NO_POSITION) { return null; } View v = null; final int childCount = rv.getChildCount(); for (int i = childCount - 1; i >= 0; i--) { final View v2 = rv.getChildAt(i); final RecyclerView.ViewHolder vh = rv.getChildViewHolder(v2); if (vh != null) { final int position = vh.getLayoutPosition(); if ((position >= firstVisiblePosition) && (position <= lastVisiblePosition) && range.checkInRange(position)) { v = v2; break; } } } return v; }
@Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { if (!(prefs.getShowBounds() || prefs.getShowOffsets())) return; int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View child = parent.getChildAt(i);
@Override public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State state) { if (parent.isAnimating()) return; final int childCount = parent.getChildCount(); final RecyclerView.LayoutManager lm = parent.getLayoutManager(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); RecyclerView.ViewHolder viewHolder = parent.getChildViewHolder(child); if (viewHolder instanceof Divided) { final int right = lm.getDecoratedRight(child); final int bottom = lm.getDecoratedBottom(child); // draw the bottom divider canvas.drawRect(lm.getDecoratedLeft(child), bottom - dividerSize, right, bottom, paint); // draw the right edge divider canvas.drawRect(right - dividerSize, lm.getDecoratedTop(child), right, bottom - dividerSize, paint); } } }
private static View findRangeFirstItem(RecyclerView rv, ItemDraggableRange range, int firstVisiblePosition, int lastVisiblePosition) { if (firstVisiblePosition == RecyclerView.NO_POSITION || lastVisiblePosition == RecyclerView.NO_POSITION) { return null; } View v = null; final int childCount = rv.getChildCount(); for (int i = 0; i < childCount; i++) { final View v2 = rv.getChildAt(i); final RecyclerView.ViewHolder vh = rv.getChildViewHolder(v2); if (vh != null) { final int position = vh.getLayoutPosition(); if ((position >= firstVisiblePosition) && (position <= lastVisiblePosition) && range.checkInRange(position)) { v = v2; break; } } } return v; }
@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 onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { for (int i = 0; i < parent.getChildCount(); i++) { View child = parent.getChildAt(i); if (!isHeader(child, parent)) continue; RecyclerView.LayoutManager lm = parent.getLayoutManager(); float top = lm.getDecoratedTop(child) + child.getTranslationY(); float bottom = lm.getDecoratedBottom(child) + child.getTranslationY(); if (i == parent.getChildCount() - 1) { // Draw to bottom if last item bottom = Math.max(parent.getHeight(), bottom); } float right = lm.getDecoratedRight(child) + child.getTranslationX(); float left = lm.getDecoratedLeft(child) + child.getTranslationX(); c.drawRect(left, top, right, bottom, paint); } } }
int childCount = parent.getChildCount();
@Override public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State state) { super.onDrawOver(canvas, parent, state); final int childCount = parent.getChildCount(); if (childCount <= 0 || mAdapter.getItemCount() <= 0) { return; } for (int i = 0; i < childCount; i++) { View itemView = parent.getChildAt(i); int position = parent.getChildAdapterPosition(itemView); if (position == RecyclerView.NO_POSITION) { continue; } boolean hasStickyHeader = mHeaderPositionCalculator.hasStickyHeader(itemView, mOrientationProvider.getOrientation(parent), position); if (hasStickyHeader || mHeaderPositionCalculator.hasNewHeader(position, mOrientationProvider.isReverseLayout(parent))) { View header = mHeaderProvider.getHeader(parent, position); //re-use existing Rect, if any. Rect headerOffset = mHeaderRects.get(position); if (headerOffset == null) { headerOffset = new Rect(); mHeaderRects.put(position, headerOffset); } mHeaderPositionCalculator.initHeaderBounds(headerOffset, parent, header, itemView, hasStickyHeader); mRenderer.drawHeader(parent, canvas, header, headerOffset); } } }
/** * Saves current screen state: whether we are in a full image mode or not, as well as current * grid position. So that we can restore UI on configuration change. */ private void saveScreenState() { clearScreenState(); savedPhotoCount = gridAdapter.getCount(); savedPagerPosition = listAnimator.isLeaving() || pagerAdapter.getCount() == 0 ? NO_POSITION : views.pager.getCurrentItem(); if (views.grid.getChildCount() > 0) { View child = views.grid.getChildAt(0); savedGridPosition = views.grid.getChildAdapterPosition(child); savedGridPositionFromTop = child.getTop() - Views.getMarginParams(child).topMargin - views.grid.getPaddingTop(); } }
@Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (enabled) { if (mLayoutManager == null) mLayoutManager = recyclerView.getLayoutManager(); int footerItemCount = mFooterAdapter != null ? mFooterAdapter.getAdapterItemCount() : 0; if (mVisibleThreshold == -1) mVisibleThreshold = findLastVisibleItemPosition(recyclerView) - findFirstVisibleItemPosition(recyclerView) - footerItemCount; mVisibleItemCount = recyclerView.getChildCount() - footerItemCount; mTotalItemCount = mLayoutManager.getItemCount() - footerItemCount; mFirstVisibleItem = findFirstVisibleItemPosition(recyclerView); if (mLoading) { if (mTotalItemCount > mPreviousTotal) { mLoading = false; mPreviousTotal = mTotalItemCount; } } if (!mLoading && (mTotalItemCount - mVisibleItemCount) <= (mFirstVisibleItem + mVisibleThreshold)) { mCurrentPage++; onLoadMore(mCurrentPage); mLoading = true; } } }
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; } } }