GridLayout绘制复杂表格

项目中需要在Android界面上实现一个可以处理跨行跨列的复杂表格,数据来源于服务器并包含序号、行号、列号、跨行数和跨列数等信息。在实现过程中,通过将表格映射为二维数组来处理跨行占用问题,绘制时检查单元格是否已被占用,若已占用则跳过直至找到空位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目要求在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,实现滑动显示。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值