项目要求在Android页面绘制复杂表格,有跨行跨列的需求。表格数据来自于服务器,每个单元格对应相关数据:序号(index)、行号(row)、列号(col)、跨行数(rowSpan)、跨列数(colSpan)等。
实际表格如下:
由于有跨行跨列,序号不规则,容易出现画了A行后,B行的相应列数已经被占用,因此需要判断。方法是:将表格抽象为二位数组,当跨行时,标记占用的其他行的空格;在绘制时首先判断这个单元格是否被占用,如果占用,二位数组的列号加1,直到空位出现。
int row = 0;
int rowSpan = 0;
int colSpan = 0;
int lastRow = 0;
int maxCols = 0;
int colCount = 0;
int windowWidth = 获取屏幕宽度;
int colWidth = 0;
int index = 0;
View view = null;
List<Integer> filledCellList = new ArrayList<Integer>();
do {
row = ...;
rowSpan = ...;
colSpan = ...;
maxCols = ...;
GridLayout gridLayout = new GridLayout(context);
gridLayout.setColumnCount(newMaxCols);
gridLayout.setUseDefaultMargins(true);
gridLayout.setOrientation(GridLayout.HORIZONTAL);
gridLayout.setBackgroundResource(R.color.dark_green);
gridLayout.setAlignmentMode(GridLayout.ALIGN_MARGINS);
colWidth = windowWidth / maxCols;
if (row > lastRow) {
lastRow = row;
colCount = 1;
}
view = createView(...);
if (view != null) {
view.setBackgroundColor(Color.WHITE);
GridLayout.LayoutParams params = new GridLayout.LayoutParams();
params.setMargins(1, 1, 1, 1);
params.width = colWidth * colSpan;
index = maxCols * (row - 1) + colCount - 1;
while (filledCellList.contains(index)) {
colCount++;
index = maxCols * (row - 1) + colCount - 1;
}
if (rowSpan > 1) {
for (int j = row; j < row + rowSpan; j++) {
for (int i = colCount; i < colCount + colSpan; i++) {
if (j == row && i == colCount) {
continue;
}
index = maxCols * (j - 1) + i - 1;
filledCellList.add(index);
}
}
}
params.columnSpec = GridLayout.spec(colCount - 1, colSpan, GridLayout.FILL);
params.rowSpec = GridLayout.spec(row - 1, rowSpan, GridLayout.FILL);
gridLayout.addView(view, params);
colCount += colSpan;
}
} while (cursor.moveToNext()); //一个Cursor数据代表一个单元格数据
最终将GridLayout加入到ScrollView,实现滑动显示。