android - top - recyclerview itemdecoration line




RecyclerView의 항목 사이에 칸막이와 공백을 추가하는 방법은 무엇입니까? (20)

2016 년 10 월 UPDATE

지원 라이브러리 v25.0.0을 사용하면 마침내 기본 가로 및 세로 구분선을 사용할 수 있습니다!

DividerItemDecoration

다음은 dividerdividerHeight 매개 변수를 사용하여 ListView 클래스에서 이전에 수행 한 방법의 예입니다.

<ListView
    android:id="@+id/activity_home_list_view"
    android:layout_width="match_parent" 
    android:layout_height="match_parent"
    android:divider="@android:color/transparent"
    android:dividerHeight="8dp"/>

그러나 RecyclerView 클래스에서는 이러한 가능성이 없습니다.

<android.support.v7.widget.RecyclerView
    android:id="@+id/activity_home_recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="vertical"/>

이 경우 여백을 정의하거나 목록 항목의 레이아웃에 직접 사용자 정의 구분선보기를 추가하는 것이 좋습니까? 아니면 내 목표를 달성하는 더 좋은 방법이 있습니까?


Alex Fu가 Github에있는이 특정 파일에주의를 집중시킬 수 있습니다. https://gist.github.com/alexfu/0f464fc3742f134ccd1e

DividerItemDecoration.java 예제 파일은 "지원 데모에서 직접 가져 왔습니다."( https://plus.google.com/103498612790395592106/posts/VVEB3m7NkSS )

내 프로젝트에서이 파일을 가져온 다음 분할 선을 멋지게 가져 와서 리사이클 뷰에 항목 장식으로 추가 할 수있었습니다.

다음은 Recyclerview가 포함 된 내 조각에서 내 onCreateView가 어떻게 보이는지 보여줍니다.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_recycler_view, container, false);

    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.my_recycler_view);
    mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));

    mRecyclerView.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(getActivity());
    mRecyclerView.setLayoutManager(mLayoutManager);
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());

    return rootView;
}

나는 추가 스타일을 할 수 있다고 확신하지만 출발점입니다. :)


간단한 구분선을 사용하면 도움이 될 것 같아요.

각 항목에 구분선을 추가하려면 :
1- 드로어 블 디렉토리 line_divider.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="1dp" />
<solid android:color="#999999" />
</shape>

2- SimpleDividerItemDecoration 클래스 만들기
이 클래스를 정의하기 위해이 예제를 사용했습니다.
https://gist.github.com/polbins/e37206fbc444207c0e92

package com.example.myapp;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import com.example.myapp.R;

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

public SimpleDividerItemDecoration(Resources resources) {
    mDivider = resources.getDrawable(R.drawable.line_divider);
}

public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
    int left = parent.getPaddingLeft();
    int right = parent.getWidth() - parent.getPaddingRight();

    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);
    }
  }
}


3- RecyclerView를 사용하는 액티비티 또는 프래그먼트에서 onCreateView 내부에 다음을 추가합니다.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
 RecyclerView myRecyclerView = (RecyclerView) layout.findViewById(R.id.my_recycler_view);
 myRecyclerView.addItemDecoration(new SimpleDividerItemDecoration(getResources()));
 ....
 }


4- 항목 사이에 간격을 추가하려면
항목보기에 패딩 속성을 추가하기 만하면됩니다.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:padding="4dp"
>
..... item structure
</RelativeLayout>

간단한 방법은 RecyclerView 배경색과 항목의 배경색을 설정하는 것입니다. 여기에 예제가 있습니다 ...

<android.support.v7.widget.RecyclerView
    android:background="#ECEFF1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scrollbars="vertical"/>

TextView 항목 (아무 것도 될 수 있음) 아래쪽 여백 "x"dp 또는 px.

<TextView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="1dp"
    android:background="#FFFFFF"/>

출력 ...


머티리얼 디자인을 사용하여 이것을 올바르게 구현할 방법이 없기 때문에 목록 항목에 직접 디바이더를 추가하기 위해 다음 트릭을 수행했습니다.

<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/dividerColor"/>

모든 항목 간의 공백을 단순 ItemDecoration 구현하는 ItemDecoration 입니다.

public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
    private int space;

    public SpacesItemDecoration(int space) {
        this.space = space;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        outRect.left = space;
        outRect.right = space;
        outRect.bottom = space;

        // Add top margin only for the first item to avoid double space between items
        if(parent.getChildAdapterPosition(view) == 0) {
            outRect.top = space;
        }
    }
}

이것은 간단합니다. 복잡한 코드는 필요 없습니다.

    DividerItemDecoration divider = new 
    DividerItemDecoration(mRVMovieReview.getContext(), 
    DividerItemDecoration.VERTICAL);
    divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), 
       R.drawable.line_divider));
    mRVMovieReview.addItemDecoration(divider);

drawable에 다음을 추가하십시오 : line_divider.xml

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

이것은 실제로 문제를 해결하지는 않지만 일시적인 해결 방법으로 XML 레이아웃의 카드에 useCompatPadding 속성을 설정하여 Lollipop 이전 버전과 동일하게 측정 할 수 있습니다.

card_view:cardUseCompatPadding="true"

추가 만하면됩니다.

recyclerView.addItemDecoration(new DividerItemDecoration(getContext(),
                DividerItemDecoration.VERTICAL));

또한 종속성을 추가해야 할 수도 있습니다.
compile 'com.android.support:recyclerview-v7:27.1.0'

편집하다:

약간의 사용자 정의를 위해 사용자 정의 드로어 블을 추가 할 수 있습니다.

DividerItemDecoration itemDecorator = new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL);
itemDecorator.setDrawable(ContextCompat.getDrawable(getContext(), R.drawable.divider));

사용자 정의 드로어 블을 자유롭게 사용할 수 있습니다. 예를 들면 다음과 같습니다.

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="@color/colorPrimary"/>
    <size android:height="0.5dp"/>
</shape>

ItemAnimators 설정 ItemAnimators . ItemDecorator 는 애니메이션을 입력하거나 종료하지 않습니다.

나는 단순히 각 항목의 내 항목보기 레이아웃 파일에서 뷰 라인을 갖게되었습니다. 내 사건을 해결했다. DividerItemDecoration 은 단순한 구분선을 위해 많은 마법에 대한 느낌이 DividerItemDecoration 습니다. 아니면 실제 사용을 놓칠 수도 있습니다.

<View
    android:layout_width="match_parent"
    android:layout_height="1px"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:background="@color/lt_gray"/>

2016 년 10 월 업데이트

Android Support Library 버전 25.0.0에서는 DividerItemDecoration 클래스가 도입 DividerItemDecoration .

DividerItemDecoration은 LinearLayoutManager의 항목들 사이의 구분선으로 사용할 수있는 RecyclerView.ItemDecoration입니다. HORIZONTAL 및 VERTICAL 방향 모두를 지원합니다.

용법:

DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
    layoutManager.getOrientation());
recyclerView.addItemDecoration(dividerItemDecoration);

이전 답변

일부 답변은 이후에 비추천 된 메소드를 사용하거나 완전한 솔루션을 제공하지 않으므로 짧은 마무리를 시도했습니다.

ListView 와 달리 RecyclerView 클래스에는 구분선 관련 매개 변수가 없습니다. 대신 RecyclerView 의 내부 클래스 인 ItemDecoration 을 확장해야합니다.

ItemDecoration을 사용하면 응용 프로그램에서 어댑터의 데이터 세트에서 특정 항목 뷰에 특수 도면과 레이아웃 오프셋을 추가 할 수 있습니다. 이는 항목, 하이라이트, 시각적 그룹화 경계 등에서 구분선을 그릴 때 유용 할 수 있습니다.

모든 ItemDecorations는 항목이 (onDraw ()에서) 표시되고 (onDrawOver (Canvas, RecyclerView, RecyclerView.State)의 항목 뒤에 표시되기 전에) 추가 된 순서대로 그려집니다.

세로 간격 ItemDecoration

ItemDecoration 확장하고 공간 높이를 매개 변수로 취하고 getItemOffsets() 메서드를 재정의하는 사용자 정의 생성자를 추가합니다.

public class VerticalSpaceItemDecoration extends RecyclerView.ItemDecoration {

    private final int verticalSpaceHeight;

    public VerticalSpaceItemDecoration(int verticalSpaceHeight) {
        this.verticalSpaceHeight = verticalSpaceHeight;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
            RecyclerView.State state) {
        outRect.bottom = verticalSpaceHeight;
    }
}

마지막 항목 아래에 공백을 삽입하지 않으려면 다음 조건을 추가하십시오.

if (parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1) {
            outRect.bottom = verticalSpaceHeight;
}

참고 : 원하는 효과를 위해 outRect.top , outRect.leftoutRect.right 속성을 수정할 수도 있습니다.

디바이더 ItemDecoration

ItemDecoration 확장하고 onDraw() 메서드를 재정의합니다.

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

    private static final int[] ATTRS = new int[]{android.R.attr.listDivider};

    private Drawable divider;

    /**
     * Default divider will be used
     */
    public DividerItemDecoration(Context context) {
        final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS);
        divider = styledAttributes.getDrawable(0);
        styledAttributes.recycle();
    }

    /**
     * Custom divider will be used
     */
    public DividerItemDecoration(Context context, int resId) {
        divider = ContextCompat.getDrawable(context, resId);
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();

        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 + divider.getIntrinsicHeight();

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

기본 Android 분할 자 속성을 사용하는 첫 번째 생성자를 호출하거나 drawable / divider.xml과 같이 자체 드로어 블을 사용하는 두 번째 생성자를 호출 할 수 있습니다.

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

참고 : 디바이더를 항목 위에 그려야하는 경우 대신 onDrawOver() 메서드를 재정의하십시오.

용법

새 클래스를 사용하려면, 예를 들어 프래그먼트의 onCreateView() 메소드에서 RecyclerViewVerticalSpaceItemDecoration 또는 DividerSpaceItemDecoration 을 추가하십시오.

private static final int VERTICAL_ITEM_SPACE = 48;
private RecyclerView recyclerView;
private LinearLayoutManager linearLayoutManager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_feed, container, false);

    recyclerView = (RecyclerView) rootView.findViewById(R.id.fragment_home_recycler_view);
    linearLayoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(linearLayoutManager);

    //add ItemDecoration
    recyclerView.addItemDecoration(new VerticalSpaceItemDecoration(VERTICAL_ITEM_SPACE));
    //or
    recyclerView.addItemDecoration(new DividerItemDecoration(getActivity()));
    //or
    recyclerView.addItemDecoration(
            new DividerItemDecoration(getActivity(), R.drawable.divider));

    recyclerView.setAdapter(...);

    return rootView;
}

아이템 장식 과정을 간소화하기로되어있는 Lucas Rocha의 도서관 도 있습니다. 비록 그것을 시도하지 않았습니다.

features 은 다음과 같습니다.

  • 재고 항목 장식 모음 :
  • 항목 간격 가로 / 세로 구분선.
  • 목록 항목

아래 목록 항목에 줄을 추가했습니다.

<View
android:id="@+id/divider"
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/dividerColor"/>

1px가가는 선을 그립니다.

마지막 행에 대한 구분선을 숨기려면 divider.setVisiblity(View.GONE);마지막 목록 Item에 대한 onBindViewHolder를 사용하십시오.


이 링크는 나를 위해 매력처럼 일했습니다 :

ItemDecoration

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

    private Drawable mDivider;
    private boolean mShowFirstDivider = false;
    private boolean mShowLastDivider = false;


    public DividerItemDecoration(Context context, AttributeSet attrs) {
        final TypedArray a = context
                .obtainStyledAttributes(attrs, new int[]{android.R.attr.listDivider});
        mDivider = a.getDrawable(0);
        a.recycle();
    }

    public DividerItemDecoration(Context context, AttributeSet attrs, boolean showFirstDivider,
            boolean showLastDivider) {
        this(context, attrs);
        mShowFirstDivider = showFirstDivider;
        mShowLastDivider = showLastDivider;
    }

    public DividerItemDecoration(Drawable divider) {
        mDivider = divider;
    }

    public DividerItemDecoration(Drawable divider, boolean showFirstDivider,
            boolean showLastDivider) {
        this(divider);
        mShowFirstDivider = showFirstDivider;
        mShowLastDivider = showLastDivider;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
            RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        if (mDivider == null) {
            return;
        }
        if (parent.getChildPosition(view) < 1) {
            return;
        }

        if (getOrientation(parent) == LinearLayoutManager.VERTICAL) {
            outRect.top = mDivider.getIntrinsicHeight();
        } else {
            outRect.left = mDivider.getIntrinsicWidth();
        }
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        if (mDivider == null) {
            super.onDrawOver(c, parent, state);
            return;
        }

        // Initialization needed to avoid compiler warning
        int left = 0, right = 0, top = 0, bottom = 0, size;
        int orientation = getOrientation(parent);
        int childCount = parent.getChildCount();

        if (orientation == LinearLayoutManager.VERTICAL) {
            size = mDivider.getIntrinsicHeight();
            left = parent.getPaddingLeft();
            right = parent.getWidth() - parent.getPaddingRight();
        } else { //horizontal
            size = mDivider.getIntrinsicWidth();
            top = parent.getPaddingTop();
            bottom = parent.getHeight() - parent.getPaddingBottom();
        }

        for (int i = mShowFirstDivider ? 0 : 1; i < childCount; i++) {
            View child = parent.getChildAt(i);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

            if (orientation == LinearLayoutManager.VERTICAL) {
                top = child.getTop() - params.topMargin;
                bottom = top + size;
            } else { //horizontal
                left = child.getLeft() - params.leftMargin;
                right = left + size;
            }
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }

        // show last divider
        if (mShowLastDivider && childCount > 0) {
            View child = parent.getChildAt(childCount - 1);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
            if (orientation == LinearLayoutManager.VERTICAL) {
                top = child.getBottom() + params.bottomMargin;
                bottom = top + size;
            } else { // horizontal
                left = child.getRight() + params.rightMargin;
                right = left + size;
            }
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    private int getOrientation(RecyclerView parent) {
        if (parent.getLayoutManager() instanceof LinearLayoutManager) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
            return layoutManager.getOrientation();
        } else {
            throw new IllegalStateException(
                    "DividerItemDecoration can only be used with a LinearLayoutManager.");
        }
    }
}

그런 다음 당신의 활동에서 :

mCategoryRecyclerView.addItemDecoration(
    new DividerItemDecoration(this, null));

또는 조각을 사용하는 경우 :

mCategoryRecyclerView.addItemDecoration(
    new DividerItemDecoration(getActivity(), null));

자체 버전의 RecyclerView.ItemDecoration 구현

public class SpacingItemDecoration extends RecyclerView.ItemDecoration {
    private int spacingPx;
    private boolean addStartSpacing;
    private boolean addEndSpacing;

    public SpacingItemDecoration(int spacingPx) {
        this(spacingPx, false, false);
    }

    public SpacingItemDecoration(int spacingPx, boolean addStartSpacing, boolean addEndSpacing) {
        this.spacingPx = spacingPx;
        this.addStartSpacing = addStartSpacing;
        this.addEndSpacing = addEndSpacing;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        if (spacingPx <= 0) {
            return;
        }

        if (addStartSpacing && parent.getChildLayoutPosition(view) < 1 || parent.getChildLayoutPosition(view) >= 1) {
            if (getOrientation(parent) == LinearLayoutManager.VERTICAL) {
                outRect.top = spacingPx;
            } else {
                outRect.left = spacingPx;
            }
        }

        if (addEndSpacing && parent.getChildAdapterPosition(view) == getTotalItemCount(parent) - 1) {
            if (getOrientation(parent) == LinearLayoutManager.VERTICAL) {
                outRect.bottom = spacingPx;
            } else {
                outRect.right = spacingPx;
            }
        }
    }

    private int getTotalItemCount(RecyclerView parent) {
        return parent.getAdapter().getItemCount();
    }

    private int getOrientation(RecyclerView parent) {
        if (parent.getLayoutManager() instanceof LinearLayoutManager) {
            return ((LinearLayoutManager) parent.getLayoutManager()).getOrientation();
        } else {
            throw new IllegalStateException("SpacingItemDecoration can only be used with a LinearLayoutManager.");
        }
    }
}

항목에 동일한 공간을 추가하려면 가장 간단한 방법은 RecycleView에 대해 위쪽 + 왼쪽 패딩을 추가하고 카드 항목에 오른쪽 + 아래쪽 여백을 추가하는 것입니다.

dimens.xml

<resources>
    <dimen name="divider">1dp</dimen>
</resources>

list_item.xml

<CardView
 android:layout_marginBottom="@dimen/divider"
 android:layout_marginRight="@dimen/divider">
 ...
</CardView>

list.xml

<RecyclerView
 android:paddingLeft="@dimen/divider"
 android:paddingTop="@dimen/divider"
/>

1.One of the Way는 카드보기와 리사이클 뷰를 함께 사용하여 쉽게 구분선과 같은 효과를 추가 할 수 있습니다. 전의. https://developer.android.com/training/material/lists-cards.html

2.and 는 리사이클 뷰의 list_item_layout에 디바이더로서 뷰를 추가하는 것 입니다.

        <View
            android:id="@+id/view1"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/colorAccent" />

RecyclerView에 분배기를 추가하는 아주 간단한 방법이 있습니다. 사용자 정의 어댑터를 사용하여 리사이클 뷰 레이아웃을 수정 한 다음 리사이클 뷰 항목과 함께 LinearLayout을 배경색 (디바이더 색상)으로 추가하고 부모와 일치하도록 1dp (또는 요구 사항에 따라) 및 너비를 추가합니다. .

다음은 샘플 코드입니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="18dp">

    <TextView
        android:id="@+id/list_row_SNO"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight=".8"
        android:layout_gravity="end"
        android:text="44."
        android:textAlignment="center"
        android:textSize="24sp"
        android:textColor="@color/colorBlack"
        android:fontFamily="sans-serif-condensed" />

    <TextView
        android:id="@+id/list_row_Heading"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight=".2"
        android:layout_gravity="start"
        android:text="Student's application for leave and this what"
        android:textAlignment="textStart"
        android:textSize="24sp"
        android:textColor="@color/colorBlack"
        android:fontFamily="sans-serif-condensed" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:background="@color/colorHighlight">
</LinearLayout>


너무 늦었지만 GridLayoutManager이것을 사용합니다.

public class GridSpacesItemDecoration : RecyclerView.ItemDecoration
{
    private int space;

    public GridSpacesItemDecoration(int space) {
        this.space = space;
    }

    public override void GetItemOffsets(Android.Graphics.Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
    {
        var position = parent.GetChildLayoutPosition(view);

        /// Only for GridLayoutManager Layouts
        var manager = parent.GetLayoutManager() as GridLayoutManager;

        if (parent.GetChildLayoutPosition(view) < manager.SpanCount)
            outRect.Top = space;

        if (position % 2 != 0) {
            outRect.Right = space;
        }

        outRect.Left = space;
        outRect.Bottom = space;
    }
}

당신이 가진 모든 스팬 카운트에 대한이 작품.

Ollie.


정말 쉬운 해결책은 RecyclerView-FlexibleDivider 를 사용하는 것입니다.RecyclerView-FlexibleDivider

종속성 추가 :

compile 'com.yqritc:recyclerview-flexibledivider:1.4.0'

귀하의 recyclerview에 추가하십시오 :

recyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(context).build());

그리고 너 끝났어!


public class VerticalItemDecoration extends RecyclerView.ItemDecoration {

private boolean verticalOrientation = true;
private int space = 10;

public VerticalItemDecoration(int value, boolean verticalOrientation) {
    this.space = value;
    this.verticalOrientation = verticalOrientation;
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
                           RecyclerView.State state) {
    //skip first item in the list
    if (parent.getChildAdapterPosition(view) != 0) {
        if (verticalOrientation) {
            outRect.set(space, 0, 0, 0);
        } else if (!verticalOrientation) {
            outRect.set(0, space, 0, 0);
        }
    }
}
}
mCompletedShippingRecyclerView.addItemDecoration(new VerticalItemDecoration(20,false)); 






divider