-
-
Save MensObscura/4c5ea3865a2749bb345c to your computer and use it in GitHub Desktop.
DIviderItemDecoration updated without deprecation
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.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.view.View; | |
public class DividerItemDecoration extends RecyclerView.ItemDecoration { | |
private static final int[] ATTRS = new int[]{ | |
android.R.attr.listDivider | |
}; | |
public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; | |
public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; | |
private Drawable mDivider; | |
private int mOrientation; | |
public DividerItemDecoration(Context context, int orientation) { | |
final TypedArray a = context.obtainStyledAttributes(ATTRS); | |
mDivider = a.getDrawable(0); | |
a.recycle(); | |
setOrientation(orientation); | |
} | |
public void setOrientation(int orientation) { | |
if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { | |
throw new IllegalArgumentException("invalid orientation"); | |
} | |
mOrientation = orientation; | |
} | |
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 you use Android M, especialy on nexus device this method | |
will deform your item */ | |
//API >= 23 | |
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { | |
return; | |
} | |
if (mDivider == null) { | |
return; | |
} | |
if (parent.getChildAdapterPosition(view) < 1 && parent.getChildLayoutPosition(view) < 1) { | |
return; | |
} | |
if (mOrientation == LinearLayoutManager.VERTICAL) { | |
outRect.top = mDivider.getIntrinsicHeight(); | |
} else { | |
outRect.left = mDivider.getIntrinsicWidth(); | |
} | |
} | |
@Override | |
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { | |
super.onDrawOver(c, parent, state); | |
if (mDivider == null) { | |
super.onDrawOver(c, parent, state); | |
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."); | |
} | |
} | |
} |
usage Example :
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mRecyclerView.addItemDecoration(
new DividerItemDecoration(getResources().getDrawable(R.drawable.list_divider, getActivity().getTheme())));
} else {
mRecyclerView.addItemDecoration(new DividerItemDecoration(getResources().getDrawable(R.drawable.list_divider)));
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Take care of the comment in getItemOffsets(...).