private void changeDataInternal(final Action1<Action3<Integer, Integer, Boolean>> changeAction) {
        if (changeBlocked) {
            return;
        }
        //block excution of other "onChange"-actions on Checkboxes during the changeData-processing
        changeBlocked = true;

        //change the actual data
        changeAction.call(this::changeDataField);

        //change the "all" checkboxes
        for (int r = 0; r < rows.length; r++) {
            cbRowAll[r].setChecked(cntRow[r] == rows.length);
        }
        for (int c = 0; c < cols.length; c++) {
            cbColAll[c].setChecked(cntCol[c] == cols.length);
        }
        cbAllAll.setChecked(cntAll == cols.length * rows.length);

        //the onchange-actions of the "setChecked"-calls above are executed asynchronously.
        // -> Disable block after those have executed
        this.post(() -> changeBlocked = false);
    }
(re-)initializes the matrix with given data. Matrix data is deleted in the process
main/src/main/java/cgeo/geocaching/ui/CheckboxMatrixView.java