Java Code Examples for androidx.recyclerview.widget.RecyclerView#getChildAt()

The following examples show how to use androidx.recyclerview.widget.RecyclerView#getChildAt() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: StickyHeaderDecoration.java    From bcm-android with GNU General Public License v3.0 6 votes vote down vote up
/**
 * {@inheritDoc}
 */
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
    final int count = parent.getChildCount();

    for (int layoutPos = 0; layoutPos < count; layoutPos++) {
        final View child = parent.getChildAt(translatedChildPosition(parent, layoutPos));

        final int adapterPos = parent.getChildAdapterPosition(child);

        if (adapterPos != RecyclerView.NO_POSITION && ((layoutPos == 0 && sticky) || hasHeader(parent, adapter, adapterPos))) {
            View header = getHeader(parent, adapter, adapterPos).itemView;
            c.save();
            final int left = child.getLeft();
            final int top = getHeaderTop(parent, child, header, adapterPos, layoutPos);
            c.translate(left, top);
            header.draw(c);
            c.restore();
        }
    }
}
 
Example 2
Source File: GridDividerDecoration.java    From material-components-android with Apache License 2.0 6 votes vote down vote up
private void drawVertical(Canvas canvas, RecyclerView parent) {
  final int childCount = parent.getChildCount();
  final boolean isRTL =
      ViewCompat.getLayoutDirection(parent) == ViewCompat.LAYOUT_DIRECTION_RTL;
  for (int i = 0; i < childCount; i++) {
    final View child = parent.getChildAt(i);

    if (isChildInLastColumn(parent, child)) {
      continue;
    }

    parent.getDecoratedBoundsWithMargins(child, bounds);
    final int x = isRTL ? bounds.left : bounds.right;
    final int startY = bounds.top;
    final int stopY = bounds.bottom;
    canvas.drawLine(x, startY, x, stopY, dividerPaint);
  }
}
 
Example 3
Source File: DividerItem.java    From green_android with GNU General Public License v3.0 6 votes vote down vote up
@Override
public void onDrawOver(final Canvas c, final RecyclerView parent,
                       final RecyclerView.State state) {
    final int left = parent.getPaddingLeft();
    final int right = parent.getWidth() - parent.getPaddingRight();

    final int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; ++i) {
        final View child = parent.getChildAt(i);

        final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams)child.getLayoutParams();

        final int top = child.getBottom() + params.bottomMargin;
        final int bottom = top + divider.getIntrinsicHeight();

        divider.setBounds(left, top, right, bottom);
        divider.draw(c);
    }
}
 
Example 4
Source File: ListViewDecoration.java    From NewFastFrame with Apache License 2.0 6 votes vote down vote up
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
    if (divider != null) {
        int count = parent.getChildCount();
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();
        View child = null;
        for (int i = 0; i < count; i++) {
            if (count == 1) {
                break;
            }
            child = parent.getChildAt(i);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
            int top = child.getBottom() + params.bottomMargin;
            int bottom = top + divider.getIntrinsicHeight();
            divider.setBounds(left, top, right, bottom);
            divider.draw(c);
        }
    }
}
 
Example 5
Source File: GroupCreateDividerItemDecoration.java    From Telegram with GNU General Public License v2.0 6 votes vote down vote up
@Override
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
    int width = parent.getWidth();
    int top;
    int childCount = parent.getChildCount() - (single ? 0 : 1);
    for (int i = 0; i < childCount; i++) {
        View child = parent.getChildAt(i);
        View nextChild = i < childCount - 1 ? parent.getChildAt(i + 1) : null;
        int position = parent.getChildAdapterPosition(child);
        if (position < skipRows || child instanceof GroupCreateSectionCell || nextChild instanceof GroupCreateSectionCell) {
            continue;
        }
        top = child.getBottom();
        canvas.drawLine(LocaleController.isRTL ? 0 : AndroidUtilities.dp(72), top, width - (LocaleController.isRTL ? AndroidUtilities.dp(72) : 0), top, Theme.dividerPaint);
    }
}
 
Example 6
Source File: DividerItemDecoration.java    From RecyclerViewExtensions with MIT License 6 votes vote down vote up
public void drawVertical(Canvas canvas, RecyclerView parent) {
    int left = parent.getPaddingLeft();
    int right = parent.getWidth() - parent.getPaddingRight();

    final int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
        View child = parent.getChildAt(i);
        if (!hasDivider(parent, child)) {
            continue;
        }

        if (mDrawable.isStateful()) {
            mDrawable.setState(child.getDrawableState());
        }

        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
        int top = child.getBottom() + params.bottomMargin + Math.round(child.getTranslationY());
        int bottom = top + mDrawable.getIntrinsicHeight();
        drawDivider(canvas, left, top, right, bottom, child.getAlpha());
    }
}
 
Example 7
Source File: DividerGridItemDecoration.java    From MyBookshelf with GNU General Public License v3.0 6 votes vote down vote up
public void drawHorizontal(Canvas c, RecyclerView parent) {
    int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
        final View child = parent.getChildAt(i);
        final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                .getLayoutParams();
        final int left = child.getLeft() - params.leftMargin;
        final int right = child.getRight() + params.rightMargin
                + mWidthDivider.getIntrinsicWidth();
        final int top = child.getBottom() + params.bottomMargin;
        final int bottom = top + mWidthDivider.getIntrinsicHeight();
        mWidthDivider.setBounds(left, top, right, bottom);
        mWidthDivider.draw(c);
    }


}
 
Example 8
Source File: SelectiveDividerItemDecoration.java    From CommonUtils with Apache License 2.0 5 votes vote down vote up
private void drawVertical(Canvas canvas, RecyclerView parent) {
    canvas.save();

    int left;
    int right;
    if (parent.getClipToPadding()) {
        left = parent.getPaddingLeft();
        right = parent.getWidth() - parent.getPaddingRight();
        canvas.clipRect(left, parent.getPaddingTop(), right, parent.getHeight() - parent.getPaddingBottom());
    } else {
        left = 0;
        right = parent.getWidth();
    }

    int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
        if (isDecorated(i)) {
            View child = parent.getChildAt(i);
            parent.getDecoratedBoundsWithMargins(child, mBounds);
            int bottom = mBounds.bottom + Math.round(child.getTranslationY());
            int top = bottom - mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(canvas);
        }
    }

    canvas.restore();
}
 
Example 9
Source File: SuperDividerItemDecoration.java    From RecyclerViewHelper with Apache License 2.0 5 votes vote down vote up
/**
 * Draw a horizontal line.
 *
 * @param canvas Canvas
 * @param parent RecyclerView
 */
private void drawHorizontalLine(Canvas canvas, RecyclerView parent) {
    RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
    if (layoutManager == null || mDivider == null) {
        return;
    }

    canvas.save();
    final int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
        final View child = parent.getChildAt(i);
        if (isLastRow(child, parent)) {
            continue;
        }

        parent.getDecoratedBoundsWithMargins(child, mBounds);
        final int left = mBounds.left;
        final int right = mBounds.right;
        int bottom = mBounds.bottom + Math.round(child.getTranslationY());
        // Horizontal GridLayout display in the left, margin top or bottom mDividerHeight / 2.
        if (mOrientation == HORIZONTAL && layoutManager instanceof GridLayoutManager) {
            bottom += mDividerHeight / 2;
        }
        final int top = bottom - mDividerHeight;
        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(canvas);
    }
    canvas.restore();
}
 
Example 10
Source File: DrawableItemDecoration.java    From aptoide-client-v8 with GNU General Public License v3.0 5 votes vote down vote up
@Override public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
  final int left = /* parent.getPaddingLeft() + */ customHorizontalPadding;
  final int right = parent.getWidth() /* - parent.getPaddingRight() */ - customHorizontalPadding;

  final int childCount = parent.getChildCount();
  for (int i = 0; i < (childCount - 1); i++) {
    final View child = parent.getChildAt(i);
    final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
    final int top = child.getBottom() + params.bottomMargin;
    final int bottom = top + dividerDrawable.getIntrinsicHeight();
    dividerDrawable.setBounds(left, top, right, bottom);
    dividerDrawable.draw(canvas);
  }
}
 
Example 11
Source File: DividerItemDecoration.java    From monero-wallet-android-app with MIT License 5 votes vote down vote up
private void drawVertical(Canvas canvas, RecyclerView parent) {
    canvas.save();
    final int left;
    final int right;
    //noinspection AndroidLintNewApi - NewApi lint fails to handle overrides.
    if (parent.getClipToPadding()) {
        left = parent.getPaddingLeft();
        right = parent.getWidth() - parent.getPaddingRight();
        canvas.clipRect(left, parent.getPaddingTop(), right,
                parent.getHeight() - parent.getPaddingBottom());
    } else {
        left = 0;
        right = parent.getWidth();
    }

    final int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
        final View child = parent.getChildAt(i);
        parent.getDecoratedBoundsWithMargins(child, mBounds);
        final int bottom = mBounds.bottom + Math.round(child.getTranslationY());
        final int top = bottom - mDividerSize;
        mDividerPaint.setColor(mDividerColor);
        mDividerPaint.setStyle(Paint.Style.FILL);
        canvas.drawRect(left + mMarginStart, top + mMarginTop, right - mMarginEnd, bottom - mMarginBottom, mDividerPaint);
    }
    canvas.restore();
}
 
Example 12
Source File: DefaultAdapter.java    From MVPArms with Apache License 2.0 5 votes vote down vote up
/**
 * 遍历所有 {@link BaseHolder}, 释放他们需要释放的资源
 *
 * @param recyclerView {@link RecyclerView}
 */
public static void releaseAllHolder(RecyclerView recyclerView) {
    if (recyclerView == null) {
        return;
    }
    for (int i = recyclerView.getChildCount() - 1; i >= 0; i--) {
        final View view = recyclerView.getChildAt(i);
        RecyclerView.ViewHolder viewHolder = recyclerView.getChildViewHolder(view);
        if (viewHolder instanceof BaseHolder) {
            ((BaseHolder) viewHolder).onRelease();
        }
    }
}
 
Example 13
Source File: InstallerXAdapterDividerItemDecoration.java    From SAI with GNU General Public License v3.0 5 votes vote down vote up
private void drawVertical(Canvas canvas, RecyclerView parent) {
    canvas.save();
    final int left;
    final int right;
    //noinspection AndroidLintNewApi - NewApi lint fails to handle overrides.
    if (parent.getClipToPadding()) {
        left = parent.getPaddingLeft();
        right = parent.getWidth() - parent.getPaddingRight();
        canvas.clipRect(left, parent.getPaddingTop(), right,
                parent.getHeight() - parent.getPaddingBottom());
    } else {
        left = 0;
        right = parent.getWidth();
    }

    final int childCount = parent.getChildCount();
    RecyclerView.Adapter adapter = parent.getAdapter();
    final int itemCount = adapter == null ? -1 : adapter.getItemCount();
    for (int i = 0; i < childCount; i++) {
        final View child = parent.getChildAt(i);
        int adapterPosition = parent.getChildAdapterPosition(child);
        if (adapterPosition == 0 || adapterPosition == itemCount - 1)
            continue;

        parent.getDecoratedBoundsWithMargins(child, mBounds);
        final int bottom = mBounds.bottom + Math.round(child.getTranslationY());
        final int top = bottom - mDivider.getIntrinsicHeight();
        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(canvas);
    }
    canvas.restore();
}
 
Example 14
Source File: DoubleHeaderDecoration.java    From header-decor with Apache License 2.0 5 votes vote down vote up
private int getSubHeaderTop(@NonNull RecyclerView parent, @NonNull View child,
        @NonNull View header, @NonNull View subHeader, int adapterPos, int layoutPos) {

    int top = getAnimatedTop(child) - getSubHeaderHeightForLayout(subHeader);
    if (isFirstValidChild(layoutPos, parent)) {
        final int count = parent.getChildCount();
        final long currentHeaderId = adapter.getHeaderId(adapterPos);
        final long currentSubHeaderId = adapter.getSubHeaderId(adapterPos);

        // find next view with sub-header and compute the offscreen push if needed
        for (int i = layoutPos + 1; i < count; i++) {
            final View next = parent.getChildAt(i);
            int adapterPosHere = parent.getChildAdapterPosition(next);
            if (adapterPosHere != RecyclerView.NO_POSITION) {
                final long nextHeaderId = adapter.getHeaderId(adapterPosHere);
                final long nextSubHeaderId = adapter.getSubHeaderId(adapterPosHere);

                if ((nextSubHeaderId != currentSubHeaderId)) {
                    int headersHeight = getSubHeaderHeightForLayout(subHeader) +
                            getSubHeader(parent, adapterPosHere).itemView.getHeight();
                    if (nextHeaderId != currentHeaderId) {
                        headersHeight += getHeader(parent, adapterPosHere).itemView.getHeight();
                    }

                    final int offset = getAnimatedTop(next) - headersHeight;
                    if (offset < header.getHeight()) {
                        return offset;
                    } else {
                        break;
                    }
                }
            }
        }
    }

    return Math.max(header.getHeight(), top);
}
 
Example 15
Source File: SimpleDividerDecoration.java    From a with GNU General Public License v3.0 5 votes vote down vote up
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
    int childCount = parent.getChildCount();
    int left = parent.getPaddingLeft();
    int right = parent.getWidth() - parent.getPaddingRight();

    for (int i = 0; i < childCount - 1; i++) {
        View view = parent.getChildAt(i);
        float top = view.getBottom();
        float bottom = view.getBottom() + dividerHeight;
        c.drawRect(left, top, right, bottom, dividerPaint);
    }
}
 
Example 16
Source File: StickyHeaderDecoration.java    From bcm-android with GNU General Public License v3.0 5 votes vote down vote up
protected int getHeaderTop(RecyclerView parent, View child, View header, int adapterPos,
                           int layoutPos) {
    int headerHeight = getHeaderHeightForLayout(header);
    int top = getChildY(parent, child) - headerHeight;
    if (sticky && layoutPos == 0) {
        final int count = parent.getChildCount();
        final long currentId = adapter.getHeaderId(adapterPos);
        // find next view with header and compute the offscreen push if needed
        for (int i = 1; i < count; i++) {
            int adapterPosHere = parent.getChildAdapterPosition(parent.getChildAt(translatedChildPosition(parent, i)));
            if (adapterPosHere != RecyclerView.NO_POSITION) {
                long nextId = adapter.getHeaderId(adapterPosHere);
                if (nextId != currentId) {
                    final View next = parent.getChildAt(translatedChildPosition(parent, i));
                    final int offset = getChildY(parent, next) - (headerHeight + getHeader(parent, adapter, adapterPosHere).itemView.getHeight());
                    if (offset < 0) {
                        return offset;
                    } else {
                        break;
                    }
                }
            }
        }

        if (sticky) {
            top = Math.max(0, top);
        }
    }

    return top;
}
 
Example 17
Source File: MyGridDivider.java    From Ruisi with Apache License 2.0 5 votes vote down vote up
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {

    int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
        final View child = parent.getChildAt(i);
        final int left = child.getLeft();
        final int right = child.getRight();
        final int top = child.getTop();
        final int bottom = child.getBottom();
        c.drawRect(left + devideWidth / 2, top + devideWidth / 2, right - devideWidth / 2, bottom - devideWidth / 2, maint);
    }
}
 
Example 18
Source File: DividerGridItemDecorationUtils.java    From shinny-futures-android with GNU General Public License v3.0 5 votes vote down vote up
private void drawHorizontal(Canvas c, RecyclerView parent) {
    int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
        final View child = parent.getChildAt(i);
        final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                .getLayoutParams();
        final int left = child.getLeft() - params.leftMargin;
        final int right = child.getRight() + params.rightMargin
                + mDivider.getIntrinsicWidth();
        final int top = child.getBottom() + params.bottomMargin;
        final int bottom = top + mDivider.getIntrinsicHeight();
        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(c);
    }
}
 
Example 19
Source File: GridSpacingItemDecoration.java    From MyBookshelf with GNU General Public License v3.0 4 votes vote down vote up
/***/
private void drawGrideview1(Canvas canvas, RecyclerView parent) {
    GridLayoutManager linearLayoutManager = (GridLayoutManager) parent.getLayoutManager();
    int childSize = parent.getChildCount();
    int top, bottom, left, right, spancount;
    spancount = linearLayoutManager.getSpanCount();
    for (int i = 0; i < childSize; i++) {
        final View child = parent.getChildAt(i);
        //画横线
        RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
        top = child.getBottom() + layoutParams.bottomMargin;
        bottom = top + space;
        left = layoutParams.leftMargin + child.getPaddingLeft() + space;
        right = child.getMeasuredWidth() * (i + 1) + left + space * i;
        if (mDivider != null) {
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(canvas);
        }
        if (mPaint != null) {
            canvas.drawRect(left, top, right, bottom, mPaint);
        }
        //画竖线
        top = (layoutParams.topMargin + space) * (i / linearLayoutManager.getSpanCount() + 1);
        bottom = (child.getMeasuredHeight() + space) * (i / linearLayoutManager.getSpanCount() + 1) + space;
        left = child.getRight() + layoutParams.rightMargin;
        right = left + space;
        if (mDivider != null) {
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(canvas);
        }
        if (mPaint != null) {
            canvas.drawRect(left, top, right, bottom, mPaint);
        }

        //画上缺失的线框
        if (i < spancount) {
            top = child.getTop() + layoutParams.topMargin;
            bottom = top + space;
            left = (layoutParams.leftMargin + space) * (i + 1);
            right = child.getMeasuredWidth() * (i + 1) + left + space * i;
            if (mDivider != null) {
                mDivider.setBounds(left, top, right, bottom);
                mDivider.draw(canvas);
            }
            if (mPaint != null) {
                canvas.drawRect(left, top, right, bottom, mPaint);
            }
        }
        if (i % spancount == 0) {
            top = (layoutParams.topMargin + space) * (i / linearLayoutManager.getSpanCount() + 1);
            bottom = (child.getMeasuredHeight() + space) * (i / linearLayoutManager.getSpanCount() + 1) + space;
            left = child.getLeft() + layoutParams.leftMargin;
            right = left + space;
            if (mDivider != null) {
                mDivider.setBounds(left, top, right, bottom);
                mDivider.draw(canvas);
            }
            if (mPaint != null) {
                canvas.drawRect(left, top, right, bottom, mPaint);
            }
        }
    }
}
 
Example 20
Source File: MediaActivity.java    From Telegram-FOSS with GNU General Public License v2.0 4 votes vote down vote up
private void updateSections(RecyclerView listView, boolean checkTopBottom) {
    int count = listView.getChildCount();
    int minPositionDateHolder = Integer.MAX_VALUE;
    View minDateChild = null;
    float padding = listView.getPaddingTop() + actionBar.getTranslationY();
    int minTop = Integer.MAX_VALUE;
    int maxBottom = 0;

    for (int a = 0; a < count; a++) {
        View view = listView.getChildAt(a);
        int bottom = view.getBottom();
        minTop = Math.min(minTop, view.getTop());
        maxBottom = Math.max(bottom, maxBottom);
        if (bottom <= padding) {
            continue;
        }
        int position = view.getBottom();
        if (view instanceof SharedMediaSectionCell || view instanceof GraySectionCell) {
            if (view.getAlpha() != 1.0f) {
                view.setAlpha(1.0f);
            }
            if (position < minPositionDateHolder) {
                minPositionDateHolder = position;
                minDateChild = view;
            }
        }
    }
    if (minDateChild != null) {
        if (minDateChild.getTop() > padding) {
            if (minDateChild.getAlpha() != 1.0f) {
                minDateChild.setAlpha(1.0f);
            }
        } else {
            if (minDateChild.getAlpha() != 0.0f) {
                minDateChild.setAlpha(0.0f);
            }
        }
    }
    if (checkTopBottom) {
        if (maxBottom != 0 && maxBottom < (listView.getMeasuredHeight() - listView.getPaddingBottom())) {
            resetScroll();
        } else if (minTop != Integer.MAX_VALUE && minTop > listView.getPaddingTop() + actionBar.getTranslationY()) {
            scrollWithoutActionBar(listView, -listView.computeVerticalScrollOffset());
            resetScroll();
        }
    }
}