Created
October 29, 2014 12:10
-
-
Save akmalxxx/233abbae200b5e87297b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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."); | |
} | |
} |
@fatfingers
Hi, I'm Seyoung.
I want to use your code in my commercial app.
But I can'f find any terms and conditions for use, reproduction, and distribution.
I wonder if I can use the code for commercial distribution or not.
Please let me know how I can use the code for commercial distribution.
Thanks.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@pratikbutani
use
getChildAdapterPosition
orgetChildLayoutPosition
insteadgetChildPosition
use
instead