/*
* Copyright 2015 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.plaidapp.ui.recyclerview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.support.annotation.ColorInt;
import android.support.annotation.ColorRes;
import android.support.annotation.DimenRes;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
import android.view.View;
/**
* A {@link RecyclerView.ItemDecoration} which draws dividers (along the right & bottom)
* for certain {@link RecyclerView.ViewHolder} types.
*/
public class GridItemDividerDecoration extends RecyclerView.ItemDecoration {
private final Class[] dividedClasses;
private final int dividerSize;
private final Paint paint;
public GridItemDividerDecoration(Class[] dividedClasses,
int dividerSize,
@ColorInt int dividerColor) {
this.dividedClasses = dividedClasses;
this.dividerSize = dividerSize;
paint = new Paint();
paint.setColor(dividerColor);
paint.setStyle(Paint.Style.FILL);
}
public GridItemDividerDecoration(Class[] dividedClasses,
@NonNull Context context,
@DimenRes int dividerSizeResId,
@ColorRes int dividerColorResId) {
this(dividedClasses,
context.getResources().getDimensionPixelSize(dividerSizeResId),
ContextCompat.getColor(context, dividerColorResId));
}
@Override
public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
if (parent.isAnimating()) return;
final int childCount = parent.getChildCount();
final RecyclerView.LayoutManager lm = parent.getLayoutManager();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
RecyclerView.ViewHolder viewHolder = parent.getChildViewHolder(child);
if (requiresDivider(viewHolder)) {
final int right = lm.getDecoratedRight(child);
final int bottom = lm.getDecoratedBottom(child);
// draw the bottom divider
canvas.drawRect(lm.getDecoratedLeft(child),
bottom - dividerSize,
right,
bottom,
paint);
// draw the right edge divider
canvas.drawRect(right - dividerSize,
lm.getDecoratedTop(child),
right,
bottom - dividerSize,
paint);
}
}
}
private boolean requiresDivider(RecyclerView.ViewHolder viewHolder) {
for (int i = 0; i < dividedClasses.length; i++) {
if (dividedClasses[i].isInstance(viewHolder)) return true;
}
return false;
}
}