public class BoardView extends SquareLayout { private boolean isGenerated; private BoardListener listener; private Cell[][] values; public BoardView(Context context) { super(context); } public BoardView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public BoardView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public void setListener(BoardListener listener) { this.listener = listener; } public void setValues(Cell[][] cells) { this.values = cells; regenerate(); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (isGenerated) { return; } regenerate(); } private void regenerate() { removeAllViews(); if (values == null || values.length == 0) { return; } isGenerated = true; setRowCount(values.length); setColumnCount(values[0].length); setAlignmentMode(ALIGN_BOUNDS); for (int x = 0; x < values.length; x++) { for (int y = 0; y < values[x].length; y++) { AutoResizeTextView cell = new AutoResizeTextView(getContext()); cell.setTextSize(500); cell.setTextColor(Color.BLACK); cell.setGravity(Gravity.CENTER); cell.setOnClickListener(new OnItemCLickListener(x, y)); cell.setSelected(values[x][y].isSelected()); cell.setText(String.valueOf(values[x][y].getValue())); cell.setBackground(getResources().getDrawable(values[x][y].getColor())); addView(cell, createParamsForCell()); } } } private LayoutParams createParamsForCell() { LayoutParams cellParams = new LayoutParams(spec(UNDEFINED, 1f), spec(UNDEFINED, 1f)); cellParams.setMargins(5, 5, 5, 5); return cellParams; } public interface BoardListener { void onItemClicked(int x, int y, View view); } private class OnItemCLickListener implements View.OnClickListener { private int x, y; OnItemCLickListener(int x, int y) { this.x = x; this.y = y; } @Override public void onClick(View view) { if (listener != null) { listener.onItemClicked(x, y, view); } } } public interface Cell { boolean isSelected(); int getValue(); @DrawableRes int getColor(); } }