Created
November 8, 2017 08:34
-
-
Save brucetoo/3811c8045437bc81fcbd6e1cc058125e to your computer and use it in GitHub Desktop.
Item Decoration
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
package com.brucetoo.expandrecyclerview.reyclerview; | |
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; | |
/** | |
* Created by Bruce Too | |
* On 05/01/2017. | |
* At 15:43 | |
*/ | |
public class DividerItemDecoration extends RecyclerView.ItemDecoration { | |
private Drawable mDivider; | |
private int mOrientation; | |
private int mHeaderCount; | |
/** | |
* Sole constructor. Takes in a {@link Drawable} to be used as the interior | |
* divider. | |
* | |
* @param divider A divider {@code Drawable} to be drawn on the RecyclerView | |
*/ | |
public DividerItemDecoration(Drawable divider) { | |
this.mDivider = divider; | |
} | |
/** | |
* Takes in a {@link Drawable} to be used as the interior divider. | |
* | |
* @param divider A divider {@code Drawable} to be drawn on the RecyclerView | |
* @param headerCount only draw divider in normal item,so ignore the headers | |
*/ | |
public DividerItemDecoration(Drawable divider, int headerCount) { | |
this.mDivider = divider; | |
this.mHeaderCount = headerCount; | |
} | |
/** | |
* Draws horizontal or vertical dividers onto the parent RecyclerView. | |
* | |
* @param canvas The {@link Canvas} onto which dividers will be drawn | |
* @param parent The RecyclerView onto which dividers are being added | |
* @param state The current RecyclerView.State of the RecyclerView | |
*/ | |
@Override | |
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) { | |
if (mOrientation == LinearLayoutManager.HORIZONTAL) { | |
drawHorizontalDividers(canvas, parent); | |
} else if (mOrientation == LinearLayoutManager.VERTICAL) { | |
drawVerticalDividers(canvas, parent); | |
} | |
} | |
/** | |
* Determines the size and location of offsets between items in the parent | |
* RecyclerView. | |
* | |
* @param outRect The {@link Rect} of offsets to be added around the child | |
* view | |
* @param view The child view to be decorated with an offset | |
* @param parent The RecyclerView onto which dividers are being added | |
* @param state The current RecyclerView.State of the RecyclerView | |
*/ | |
@Override | |
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { | |
super.getItemOffsets(outRect, view, parent, state); | |
if (parent.getChildAdapterPosition(view) <= mHeaderCount) { | |
return; | |
} | |
mOrientation = ((LinearLayoutManager) parent.getLayoutManager()).getOrientation(); | |
if (mOrientation == LinearLayoutManager.HORIZONTAL) { | |
outRect.left = mDivider.getIntrinsicWidth(); | |
} else if (mOrientation == LinearLayoutManager.VERTICAL) { | |
outRect.top = mDivider.getIntrinsicHeight(); | |
} | |
} | |
/** | |
* Adds dividers to a RecyclerView with a LinearLayoutManager or its | |
* subclass oriented horizontally. | |
* | |
* @param canvas The {@link Canvas} onto which horizontal dividers will be | |
* drawn | |
* @param parent The RecyclerView onto which horizontal dividers are being | |
* added | |
*/ | |
private void drawHorizontalDividers(Canvas canvas, RecyclerView parent) { | |
int parentTop = parent.getPaddingTop(); | |
int parentBottom = parent.getHeight() - parent.getPaddingBottom(); | |
int childCount = parent.getChildCount(); | |
for (int i = 0; i < childCount - 1; i++) { | |
View child = parent.getChildAt(i); | |
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); | |
int parentLeft = child.getRight() + params.rightMargin; | |
int parentRight = parentLeft + mDivider.getIntrinsicWidth(); | |
mDivider.setBounds(parentLeft, parentTop, parentRight, parentBottom); | |
mDivider.draw(canvas); | |
} | |
} | |
/** | |
* Adds dividers to a RecyclerView with a LinearLayoutManager or its | |
* subclass oriented vertically. | |
* | |
* @param canvas The {@link Canvas} onto which vertical dividers will be | |
* drawn | |
* @param parent The RecyclerView onto which vertical dividers are being | |
* added | |
*/ | |
private void drawVerticalDividers(Canvas canvas, RecyclerView parent) { | |
int parentLeft = parent.getPaddingLeft(); | |
int parentRight = parent.getWidth() - parent.getPaddingRight(); | |
int childCount = parent.getChildCount(); | |
for (int i = 0; i < childCount - 1; i++) { | |
View child = parent.getChildAt(i); | |
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); | |
int parentTop = child.getBottom() + params.bottomMargin; | |
int parentBottom = parentTop + mDivider.getIntrinsicHeight(); | |
mDivider.setBounds(parentLeft, parentTop, parentRight, parentBottom); | |
mDivider.draw(canvas); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment