Simple Horizontal Divider Item Decoration for RecyclerView
mRecyclerView.addItemDecoration(new SimpleDividerItemDecoration(
getApplicationContext()
));
NOTE: Add item decoration prior to setting the adapter
<?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="@color/dark_gray" /> | |
</shape> |
public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration { | |
private Drawable mDivider; | |
public SimpleDividerItemDecoration(Context context) { | |
mDivider = context.getResources().getDrawable(R.drawable.line_divider); | |
} | |
@Override | |
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); | |
} | |
} | |
} |
It works, thanks
Is there any way to make this work with a grid layout?
I notice the divider is being drawn on top of the scrollbar, anyway around this?
@keyoh
the onDrawover() method will draw the divider on the top of the item view。as a result, it also draws on the top of the scrollbar
The proposed code above adds a divider to every item including the last item.
So one can even use
<View
android:id="@+id/divider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/holo_gray_light" />
in the layout for the item to get the same effect.
As a workaround, in the adapter I check if the child is the last item and change the visibility of the divider accordingly.
@Override
public void onBindViewHolder(ViewHolder viewHolder, final int position) {
if(position==getItemCount()) //check if this is the last child, if yes then hide the divider
viewHolder.divider.setVisibility(View.GONE);
}
Any suggestions on this are welcome
It works like a charm! I wanted to use only the onDraw method so I added this other override to add space for the drawable:
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
outRect.bottom = mDivider.getIntrinsicHeight();
}
I hope it helps someone. Thanks!
A couple quick comments: because the views are recycled, you'll want to make it visible if it's not the last item. You'll also never trigger this because position will never equal getItemCount() (as long as you're returning something like List.size()). Otherwise looks like a solid alternative that'll work with ListViews too :)
Here's a quick update to your code:
int visible = (position == getItemCount()-1) ? View.GONE : View.VISIBLE;
holder.divider.setVisibility(visible);
Thanks, works well.
Though getDrawable(int)
is deprecated now. Use this instead:
ContextCompat.getDrawable(context, R.drawable.line_divider);
Thank's so much... it's work ....
@jonasbleyl : where is ContextCompat declaration?
ContextCompat is in the support library. ContextCompat.getDrawable(context, resourceID)
Thanks, works great.
thanks
Nice Work!
I've also included the default Android listDivider
drawable inside the constructor if you don't want to implement a custom one:
public SimpleDividerItemDecoration(Context context) {
final TypedArray a = context.obtainStyledAttributes(new int[]{android.R.attr.listDivider});
mDivider = a.getDrawable(0);
a.recycle();
}
Thanks.
I used this:
ResourcesCompat.getDrawable(context.getResources(), R.drawable.line_divider, context.getTheme());
I am not able to set divider to my RecyclerView can somebody help me for this?......
ResourcesCompat.getDrawable(context.getResources(), R.drawable.line_divider, context.getTheme());
where should i used this above code?please specify the location
Tried many, but this works like magic.
Thanks
it works
thanks alot
Works perfectly. Thank you
Good
I think custom drawable is not work
Hello,
Maybe use
ContextCompat
public SimpleDividerItemDecoration(Context context) { mDivider = ContextCompat.getDrawable(context, R.drawable.line_divider); }
Thanks a lot
Thanks,It worked!!
https://developer.android.com/reference/android/support/v7/widget/DividerItemDecoration.html
val linearLayoutManager = LinearLayoutManager(this)
val dividerItemDecoration = DividerItemDecoration(recyclerView.context, linearLayoutManager.orientation)
// Init recyclerView
recyclerView.setHasFixedSize(true)
recyclerView.layoutManager = linearLayoutManager
recyclerView.addItemDecoration(dividerItemDecoration)
Use "card view" for item layout and set "margin top" according to your requirement.
:)
It works beauty... Thanks!
If you don't want the last item to have a divider line after it, simply change for (int i = 0; i < childCount; i++) {
to for (int i = 0; i < childCount - 1; i++) {
and it will skip the last item divider.
Works like a charm, Thanks!