import android.content.Context; | |
import android.content.res.TypedArray; | |
import android.util.AttributeSet; | |
import android.support.v7.widget.RecyclerView; | |
import android.support.v7.widget.LinearLayoutManager; | |
import android.view.View; | |
import android.graphics.Rect; | |
import android.graphics.drawable.Drawable; | |
import android.graphics.Canvas; | |
public class DividerItemDecoration extends RecyclerView.ItemDecoration { | |
private Drawable mDivider; | |
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(Drawable divider) { mDivider = divider; } | |
@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) { | |
if (mDivider == null) { super.onDrawOver(c, parent); return; } | |
if (getOrientation(parent) == LinearLayoutManager.VERTICAL) { | |
final int left = parent.getPaddingLeft(); | |
final int right = parent.getWidth() - parent.getPaddingRight(); | |
final int childCount = parent.getChildCount(); | |
for (int i=1; i < childCount; i++) { | |
final View child = parent.getChildAt(i); | |
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); | |
final int size = mDivider.getIntrinsicHeight(); | |
final int top = child.getTop() - params.topMargin; | |
final int bottom = top + size; | |
mDivider.setBounds(left, top, right, bottom); | |
mDivider.draw(c); | |
} | |
} else { //horizontal | |
final int top = parent.getPaddingTop(); | |
final int bottom = parent.getHeight() - parent.getPaddingBottom(); | |
final int childCount = parent.getChildCount(); | |
for (int i=1; i < childCount; i++) { | |
final View child = parent.getChildAt(i); | |
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); | |
final int size = mDivider.getIntrinsicWidth(); | |
final int left = child.getLeft() - params.leftMargin; | |
final int 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."); | |
} | |
} |
This comment has been minimized.
This comment has been minimized.
something like |
This comment has been minimized.
This comment has been minimized.
is it most easy if declare a xml with margin top and margin bottom? |
This comment has been minimized.
This comment has been minimized.
This si also deprecated now, onDrawOver should now also take in |
This comment has been minimized.
This comment has been minimized.
@fatfingers |
This comment has been minimized.
This comment has been minimized.
Great work, but how can I set the divider height? Thank you |
This comment has been minimized.
This comment has been minimized.
Why do we now need 75 lines of code to draw a list divider? |
This comment has been minimized.
This comment has been minimized.
Because GOOGLE assumes android developers are not humans ...... but super humans... who for example if asked for time will first invent a clock and then a time machine to go back into the moment you asked for time and then tell you the time... developing for iOS is much more human... |
This comment has been minimized.
This comment has been minimized.
@cbedoy you still have a problem with the first and the last items, usually you don't need margin top for the first item and margin bottom for the last one |
This comment has been minimized.
This comment has been minimized.
Hi, I tried it. but I get an error, Call require API level 21 mListView.addItemDecoration( |
This comment has been minimized.
This comment has been minimized.
@MrThiago, getDrawable(int, theme) is for API 21+ only. Use
|
This comment has been minimized.
This comment has been minimized.
this only for LinearLayoutManager ? How can I draw dividers for StaggeredGridManager or GridLayoutManager? |
This comment has been minimized.
This comment has been minimized.
|
This comment has been minimized.
This comment has been minimized.
@pratikbutani use public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) instead public void onDrawOver(Canvas c, RecyclerView parent) |
This comment has been minimized.
This comment has been minimized.
@fatfingers |
This comment has been minimized.
Hi! How do I use this?