视图类无法获取Game类中已修改的gameGrid数组问题求助
首先得说,你遇到的核心问题其实很明确:Game类里的gameGrid已经被正确修改了,但你的自定义View完全不知道数据变了,所以一直用旧数据绘制,看起来就像没更新一样。我帮你梳理下代码里的问题和修复步骤:
1. 先修复Game类里混乱的placedCell方法
你现在的这个方法写了一堆没用的循环,完全是在做无用功,根本没正确完成"获取指定单元格值"的任务。看你代码里的逻辑,这个方法只需要返回对应行列的网格值就行,改成这样:
public int placedCell(int row, int column) { // 先做个越界判断,避免数组下标异常 if (row >= 0 && row < 10 && column >= 0 && column < 10) { return gameGrid[row][column]; } return 0; // 越界时返回默认值0 }
之前的嵌套循环、给MainActivity设置行列的操作都是多余的,删掉就好。
2. 关键:修改数据后主动通知View重绘
Android的自定义View不会自动监听数据变化,你得手动告诉它"数据变了,快重新画一遍"。在Main类的点击事件里,调用完mGame.place()之后,直接调用View的invalidate()方法触发重绘:
placeButton.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { mGame.place(size, isHorizontal, row, column); // 假设你的自定义View实例叫mGridView,替换成你实际的变量名 mGridView.invalidate(); } });
这里要确保你在Main类里持有这个自定义View的实例引用,不然没法调用invalidate()。如果是在子线程修改数据(不过你这里是点击事件,在主线程),就用postInvalidate(),主线程用invalidate()就行。
3. 检查View绘制的行列对应关系
看你View类里的循环:
int x = mGame.placedCell(row, col);
再看Game类里的place方法是操作gameGrid[top][left](行在前,列在后),这里的参数顺序是对的,但最好再确认下,别把行列搞反了,不然会出现"数据改了但显示位置不对"的问题。
另外,别把gameGrid声明为static,这会导致多个实例共享数据,反而容易出问题,只要View类持有正确的Game实例引用就够了。
总结一下:你之前的问题就是改了数据但没触发View重绘,加上placedCell方法的逻辑错误导致取值可能不对。按上面的步骤改完,应该就能看到网格更新了。
内容的提问来源于stack exchange,提问作者aiox

