private int getNumberOfRows() { int offset = getNumberOfItems() % getNumberOfColumns() == 0 ? 0 : 1; return offset + getNumberOfItems() / getNumberOfColumns(); }
/** * 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); }
/** * Returns the position adjacent to the provided one in a specific direction. */ public Position getAdjacentItemPosition(Position position, Direction direction) { Position adjacent; Coordinate displacement = getDisplacement(direction); int adjacentColumn = position.getColumn() + displacement.getX(); int adjacentRow = position.getRow() + displacement.getY(); int numberOfRows = getNumberOfRows(); int numberOfColumns = getNumberOfColumns(); int numberOfItems = getNumberOfItems(); if (adjacentColumn < 0 || adjacentColumn >= numberOfColumns || adjacentRow < 0 || adjacentRow > numberOfRows || adjacentColumn + numberOfColumns * adjacentRow >= numberOfItems) { adjacent = Position.INVALID_POSITION; } else { adjacent = new Position( numberOfColumns * adjacentRow + adjacentColumn, adjacentColumn, adjacentRow, numberOfColumns - 1, numberOfRows - 1); } return adjacent; }
@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); } }
Position eastPosition = positionAdapter.getAdjacentItemPosition(position, Direction.EAST); Position southPosition = positionAdapter.getAdjacentItemPosition(position, Direction.SOUTH); Position southEastPosition = positionAdapter.getAdjacentItemPosition(position, Direction.SOUTH_EAST);