You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

视图类无法获取Game类中已修改的gameGrid数组问题求助

解决10×10网格修改后视图不更新的问题

首先得说,你遇到的核心问题其实很明确: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:32:37