Android
RecyclerView 데코레이션
수색…
통사론
- RecyclerView addItemDecoration (RecyclerView.ItemDecoration 장식)
- RecyclerView addItemDecoration (RecyclerView.ItemDecoration 장식, int 인덱스)
매개 변수
매개 변수 | 세부 |
---|---|
장식 | RecyclerView 에 추가 할 항목 장식 |
색인 | 이 RecyclerView 의 장식리스트의 인덱스 이것은 getItemOffset 및 onDraw 가 호출되는 순서입니다. 나중에 호출하면 이전 호출이 초과 될 수 있습니다. |
비고
장식은 정적이다.
장식은 그려지기 때문에 클릭 리스너 또는 다른 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.VERTICAL
와 DividerItemDecoration.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>