Разделители элементов в RecyclerView

  1. package ua.naiksoftware.view.util;
  2.  
  3. import android.graphics.Canvas;
  4. import android.graphics.Paint;
  5. import android.graphics.Rect;
  6. import android.support.v7.widget.RecyclerView;
  7. import android.view.View;
  8.  
  9. import java.util.List;
  10.  
  11. /**
  12.  * Created by naik on 23.06.2016.
  13.  */
  14. public class ItemDividerDecorator extends RecyclerView.ItemDecoration {
  15.  
  16.     public static final int NO_COLOR = -1;
  17.  
  18.     public static final int FLAG_DIVIDER_ABOVE = 1 << 1;
  19.     public static final int FLAG_DIVIDER_BELOW = 1 << 2;
  20.  
  21.     private final OffsetEvaluator mOffsetEvaluator;
  22.     private final int mColor;
  23.     private final int mVerticalOffset;
  24.     private final List<?> mDataSet;
  25.     private final Paint mPaint;
  26.  
  27.     /**
  28.      * Draw offsets between items in data set
  29.      *
  30.      * @param dataSet         items in recycler's view adapter
  31.      * @param dividerColor    if -1 transparent
  32.      * @param vertical        vertical offset
  33.      * @param offsetEvaluator apply for evaluated items
  34.      */
  35.     public ItemDividerDecorator(List<?> dataSet, int dividerColor, int vertical, OffsetEvaluator offsetEvaluator) {
  36.         mColor = dividerColor;
  37.         mOffsetEvaluator = offsetEvaluator;
  38.         mVerticalOffset = vertical;
  39.         mDataSet = dataSet;
  40.         mPaint = new Paint();
  41.         mPaint.setColor(dividerColor);
  42.         mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
  43.     }
  44.  
  45.     @Override
  46.     public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
  47.         int childCount = parent.getChildCount();
  48.         if (mColor != NO_COLOR) {
  49.             for (int i = 0; i < childCount; i++) {
  50.                 View child = parent.getChildAt(i);
  51.                 int adapterPosition = parent.getChildAdapterPosition(child);
  52.                 int flags = mOffsetEvaluator.needsOffsetForItem(mDataSet.get(adapterPosition), adapterPosition);
  53.                 if (mVerticalOffset > 0) {
  54.                     // Draw above
  55.                     if ((flags & FLAG_DIVIDER_ABOVE) != 0 && adapterPosition != 0
  56.                             && (mOffsetEvaluator.needsOffsetForItem(mDataSet.get(adapterPosition - 1), adapterPosition - 1) & FLAG_DIVIDER_BELOW) == 0) {
  57.                         c.drawRect(
  58.                                 child.getLeft() + child.getTranslationX(),
  59.                                 child.getTop() - mVerticalOffset + child.getTranslationY(),
  60.                                 child.getRight() + child.getTranslationX(),
  61.                                 child.getY() + child.getTranslationY(),
  62.                                 mPaint);
  63.                     }
  64.                     // Draw below
  65.                     if ((flags & FLAG_DIVIDER_BELOW) != 0 && adapterPosition < mDataSet.size() - 1) {
  66.                         c.drawRect(
  67.                                 child.getLeft() + child.getTranslationX(),
  68.                                 child.getBottom() + child.getTranslationY(),
  69.                                 child.getRight() + child.getTranslationX(),
  70.                                 child.getBottom() + mVerticalOffset + child.getTranslationY(),
  71.                                 mPaint);
  72.                     }
  73.                 }
  74.             }
  75.         }
  76.     }
  77.  
  78.     @Override
  79.     public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
  80.         int adapterPosition = parent.getChildAdapterPosition(view);
  81.         int flags = mOffsetEvaluator.needsOffsetForItem(mDataSet.get(adapterPosition), adapterPosition);
  82.         if (mVerticalOffset > 0) {
  83.             // Draw above
  84.             if ((flags & FLAG_DIVIDER_ABOVE) != 0 && adapterPosition != 0
  85.                     && (mOffsetEvaluator.needsOffsetForItem(mDataSet.get(adapterPosition - 1), adapterPosition - 1) & FLAG_DIVIDER_BELOW) == 0) {
  86.                 outRect.set(0, mVerticalOffset, 0, 0);
  87.             }
  88.             // Draw below
  89.             if ((flags & FLAG_DIVIDER_BELOW) != 0 && adapterPosition < mDataSet.size() - 1) {
  90.                 outRect.set(0, 0, 0, mVerticalOffset);
  91.             }
  92.         }
  93.     }
  94.  
  95.     public interface OffsetEvaluator {
  96.         int needsOffsetForItem(Object item, int position);
  97.     }
  98. }
Использование:
  1. List<? extends Model> dataSet =...; // Обьекты в списке
  2. ((RecyclerView) container.findViewById(R.id.recyclerView))
  3.         .addItemDecoration(new ItemDividerDecorator(dataSet, Color.BLACK, 5, (item, position) -> {
  4.             // Некоторая логика и условия если нужно
  5.             return ItemDividerDecorator.FLAG_DIVIDER_BELOW | ItemDividerDecorator.FLAG_DIVIDER_ABOVE;
  6.         }));
Скриншот

Реклама

Мы в соцсетях

tw tg yt gt