수색…


통사론

매개 변수

매개 변수 세부
장식 RecyclerView 에 추가 할 항목 장식
색인 RecyclerView 의 장식리스트의 인덱스 이것은 getItemOffsetonDraw 가 호출되는 순서입니다. 나중에 호출하면 이전 호출이 초과 될 수 있습니다.

비고

장식은 정적이다.

장식은 그려지기 때문에 클릭 리스너 또는 다른 UI 기능을 추가 할 수는 없습니다.

다중 장식

RecyclerView 여러 장식을 추가하는 것이 경우에 따라 작동하지만 현재 측정 또는 그리기 할 때 다른 장식을 고려할 공용 API가 없습니다. 뷰 경계 나 뷰 데코 레이션 된 경계를 얻을 수 있습니다. 데코 레이팅 된 경계는 적용된 모든 데모 오프셋의 합계입니다.

기타 관련 주제 :

RecyclerView
RecyclerView onClickListener

공식 javadoc

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ItemDecoration.html

구분 기호 그리기

이렇게하면 모든보기의 맨 아래에 선이 그려 지지만 마지막 항목은 항목 사이의 구분자 역할을합니다.

public class SeparatorDecoration extends RecyclerView.ItemDecoration {

    private final Paint mPaint;
    private final int mAlpha;

    public SeparatorDecoration(@ColorInt int color, float width) {
        mPaint = new Paint();
        mPaint.setColor(color);
        mPaint.setStrokeWidth(width);
        mAlpha = mPaint.getAlpha();
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams();

        // we retrieve the position in the list
        final int position = params.getViewAdapterPosition();

        // add space for the separator to the bottom of every view but the last one
        if (position < state.getItemCount()) {
            outRect.set(0, 0, 0, (int) mPaint.getStrokeWidth()); // left, top, right, bottom
        } else {
            outRect.setEmpty(); // 0, 0, 0, 0
        }
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        // a line will draw half its size to top and bottom,
        // hence the offset to place it correctly
        final int offset = (int) (mPaint.getStrokeWidth() / 2);

        // this will iterate over every visible view
        for (int i = 0; i < parent.getChildCount(); i++) {
            final View view = parent.getChildAt(i);
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams();

            // get the position
            final int position = params.getViewAdapterPosition();

            // and finally draw the separator
            if (position < state.getItemCount()) {
                // apply alpha to support animations
                mPaint.setAlpha((int) (view.getAlpha() * mAlpha));

                float positionY = view.getBottom() + offset + view.getTranslationY();
                // do the drawing
                c.drawLine(view.getLeft() + view.getTranslationX(),
                        positionY,
                        view.getRight() + view.getTranslationX(),
                        positionY,
                        mPaint);
            }
        }
    }
}

ItemDecoration을 사용하여 항목 당 여백

RecyclerView.ItemDecoration 을 사용하여 RecyclerView.ItemDecoration 각 항목 주위에 여백을 추가 할 수 있습니다. 이렇게하면 경우에 따라 어댑터 구현과 항목 뷰 XML을 모두 정리할 수 있습니다.

public class MyItemDecoration
    extends RecyclerView.ItemDecoration {

    private final int extraMargin;

    @Override
    public void getItemOffsets(Rect outRect, View view,
            RecyclerView parent, RecyclerView.State state) {

        int position = parent.getChildAdapterPosition(view);

        // It's easy to put extra margin on the last item...
        if (position + 1 == parent.getAdapter().getItemCount()) {
            outRect.bottom = extraMargin; // unit is px
        }

        // ...or you could give each item in the RecyclerView different
        // margins based on its position...
        if (position % 2 == 0) {
            outRect.right = extraMargin;
        } else {
            outRect.left = extraMargin;
        }

        // ...or based on some property of the item itself
        MyListItem item = parent.getAdapter().getItem(position);
        if (item.isFirstItemInSection()) {
            outRect.top = extraMargin;
        }
    }

    public MyItemDecoration(Context context) {
        extraMargin = context.getResources()
                .getDimensionPixelOffset(R.dimen.extra_margin);
    }
}

장식을 사용하려면 RecyclerView에 장식을 추가하기 만하면됩니다.

// in your onCreate()
RecyclerView rv = (RecyclerView) findItemById(R.id.myList);
rv.addItemDecoration(new MyItemDecoration(context));

RecyclerView에 구분선 추가

먼저 RecyclerView.ItemDecoration 을 확장하는 클래스를 생성해야합니다.

public class SimpleBlueDivider extends RecyclerView.ItemDecoration {
private Drawable mDivider;

public SimpleBlueDivider(Context context) {
    mDivider = context.getResources().getDrawable(R.drawable.divider_blue);
}

@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
    //divider padding give some padding whatever u want or disable
    int left =parent.getPaddingLeft()+80;
    int right = parent.getWidth() - parent.getPaddingRight()-30;

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

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

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

        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(c);
    }
}

}

drawable 폴더에 divider_blue.xml 을 추가하십시오.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<size android:width="1dp" android:height="4dp" />
<solid android:color="#AA123456" />
</shape>

다음과 같이 사용하십시오.

recyclerView.addItemDecoration(new SimpleBlueDivider(context));

결과는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오.

이 이미지는 어떻게 디바이더가 작동하는지 보여주는 예입니다. 디바이더를 추가 할 때 Material Design 스펙을 따르고 싶다면이 링크를보십시오. 디바이더 와 링크를 제공하여 @Brenden Kromhout 에 감사하십시오.

DividerItemDecoration 및 DividerItemDecoration를 사용하여 나누기를 추가하는 방법

DividerItemDecoration 은 항목 간의 구분선으로 사용할 수있는 RecyclerView.ItemDecoration 입니다.

DividerItemDecoration mDividerItemDecoration = new DividerItemDecoration(context,
             mLayoutManager.getOrientation());
recyclerView.addItemDecoration(mDividerItemDecoration);

DividerItemDecoration.VERTICALDividerItemDecoration.HORIZONTAL 사용하여 방향을 모두 지원합니다.

RecycleView의 GridLayoutManager에 대한 ItemOffsetDecoration

다음 예제는 GridLayout의 항목에 동일한 공간을 제공하는 데 도움이됩니다.

ItemOffsetDecoration.java

public class ItemOffsetDecoration extends RecyclerView.ItemDecoration {

    private int mItemOffset;

    private int spanCount = 2;

    public ItemOffsetDecoration(int itemOffset) {
        mItemOffset = itemOffset;
    }

    public ItemOffsetDecoration(@NonNull Context context, @DimenRes int itemOffsetId) {
        this(context.getResources().getDimensionPixelSize(itemOffsetId));
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
                               RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);

        int position = parent.getChildLayoutPosition(view);

        GridLayoutManager manager = (GridLayoutManager) parent.getLayoutManager();

        if (position < manager.getSpanCount())
            outRect.top = mItemOffset;

        if (position % 2 != 0) {
            outRect.right = mItemOffset;
        }

        outRect.left = mItemOffset;
        outRect.bottom = mItemOffset;
    }
}

아래 코드처럼 ItemDecoration을 호출 할 수 있습니다.

recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);

GridLayoutManager lLayout = new GridLayoutManager(getActivity(), 2);

ItemOffsetDecoration itemDecoration = new ItemOffsetDecoration(mActivity, R.dimen.item_offset);
recyclerView.addItemDecoration(itemDecoration);

recyclerView.setLayoutManager(lLayout);

및 예제 항목 오프셋

<dimen name="item_offset">5dp</dimen>


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow