@NonNull private DividerItemDecoration getDivider() { Drawable dividerBackground = ContextCompat.getDrawable(getActivity(), R.drawable.dark_blue_divider); Collection<Layer> layers = LayersBuilder.with( new Layer(DividerBuilder.from(dividerBackground).erase(Direction.getVertical()).build()), new Layer(new HeaderSelector(), DividerBuilder.fromEmpty().with(dividerBackground, Direction.SOUTH).build())).build(); return new DividerItemDecoration(layers); }
/** * Returns a position given the absolute index. */ public Position getPositionByIndex(int index) { int numberOfColumns = getNumberOfColumns(); int numberOfRows = getNumberOfRows(); return new Position( index, (index - offset) % numberOfColumns, (index - offset) / numberOfColumns, numberOfColumns - 1, numberOfRows - 1); }
/** * Adds the eraser drawable to all the directions provided for the divider. */ public DividerBuilder erase(EnumSet<Direction> directions) { return with(Divider.ERASER, directions); }
private RecyclerView.ItemDecoration getItemDecoration() { Drawable blackDrawable = getResources().getDrawable(R.drawable.black_divider); Drawable greyDrawable = getResources().getDrawable(R.drawable.grey_divider); Collection<Layer> layers = LayersBuilder.with( new Layer(new AllItemsSelector(), DividerBuilder.get().with(greyDrawable).build()), new Layer(new EvenCellRowSelector(), DividerBuilder.get().with(blackDrawable).build())) .build(); return new DividerItemDecoration(layers); } }
Divider override(Divider override, EnumSet<Direction> overrideDirections, int depth) { Divider overridden = new Divider(this); for (Direction direction : overrideDirections) { Sublayer sublayer = override.getSublayer(direction); if (sublayer != null && (!overridden.hasSublayer(direction) || depth >= getSublayer(direction) .getDepth())) { overridden.sublayers.put(direction, new Sublayer(sublayer.getDrawable(), depth)); } } return overridden; }
/** * Returns a new builder with the drawable applied to all the sides of the divider. */ public static DividerBuilder from(Drawable drawable) { DividerBuilder builder = new DividerBuilder(); builder.with(drawable); return builder; }
Divider overrideSublayer(Divider override, Direction sourceDirection, Direction targetDirection) { Divider overridden = new Divider(this); if (override.hasSublayer(sourceDirection)) { Sublayer overrideSublayer = override.getSublayer(sourceDirection); if (!overridden.hasSublayer(targetDirection) || overrideSublayer.isCloserThan( overridden.getSublayer(targetDirection))) { overridden.sublayers.put(targetDirection, overrideSublayer); } } return overridden; }
@Override public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State state) { if (positionAdapter == null) { positionAdapter = new PositionAdapter(parent.getLayoutManager(), offset); } int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View child = parent.getChildAt(i); int absolutePosition = parent.getChildAdapterPosition(child); Position position = positionAdapter.getPositionByIndex(absolutePosition); Divider divider = dividerMap.getDivider(position, positionAdapter); drawDivider(canvas, child, divider, position); } }
/** * Returns a new builder with the eraser drawable applied to all the sides of the divider. */ public static DividerBuilder fromEmpty() { return from(Divider.ERASER); }
@Override public boolean isPositionSelected(Position position) { return position.getRow() % 2 == 0; } }
private int getNumberOfRows() { int offset = getNumberOfItems() % getNumberOfColumns() == 0 ? 0 : 1; return offset + getNumberOfItems() / getNumberOfColumns(); }
@Override public boolean isPositionSelected(Position position) { return position.getAbsoluteIndex() >= offset; }
/** * Returns a new LayersBuilder with all the provided layers included. */ public static LayersBuilder from(Collection<Layer> layers) { return new LayersBuilder(layers); }
/** * Returns a new Divider properly configured. */ public Divider build() { return new Divider(sublayers); } }
/** * Returns a new builder with no configuration. */ public static DividerBuilder get() { return new DividerBuilder(); }
public DividerMap(Collection<Layer> layers) { this.layers = layers; this.cache = new DividerMapCache(); }
@NonNull private DividerItemDecoration getDivider() { Drawable dividerBackground = ContextCompat.getDrawable(getActivity(), R.drawable.dark_blue_divider); Collection<Layer> layers = LayersBuilder.with( new Layer(DividerBuilder.from(dividerBackground).erase(Direction.getVertical()).build()), new Layer(new HeaderSelector(), DividerBuilder.fromEmpty().with(dividerBackground, Direction.SOUTH).build())).build(); return new DividerItemDecoration(layers); }
/** * Adds the eraser drawable to all the sides of the divider. */ public DividerBuilder erase() { return with(Divider.ERASER); }
/** * Adds the eraser drawable to the specific direction. */ public DividerBuilder erase(Direction direction) { return with(Divider.ERASER, direction); }