如何从视图类访问数组?

时间:2019-02-08 22:33:39

标签: java android android-studio

我目前正在10x10网格上工作,并试图对其框进行更改。我有3个用于该操作的类,但进行更改后无法更改视图。 3个课程:

  1. 主要(我在其中进行更改)

    placeButton.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view) {
            mGame.place(size, isHorizontal, row, column);});
    
  2. 游戏(我负责处理和应用更改的地方)

    System.out.println("Place Ships: " + size + isHorizontal + left + top);
    
    if(isHorizontal == true) {//if horiz
        if(gameGrid[top][left] ==0) {
            for (int i = 0; i < size; i++) {
                gameGrid[top][left + i] = size;
            } }
        else{
            System.out.println("ALREADY FILLED");
        }
    
  3. 视图(在其中绘制和绘制网格的地方)

    System.out.println("SETUP VIEW ARRAY");
    for (int col = 0; col < colCount; col++) {
    
        for (int row = 0; row < rowCount; row++) {
    
            int x = mGame.placedCell(row, col);
            System.out.print(x + " ");//tocheck if the array obtained correctly
            float cx = separatorSize + (chosenDiameter + separatorSize) * col;
            float cy = separatorSize + (chosenDiameter + separatorSize) * row;
    
            if(x > 0){
                System.out.println("FOOOOOOOOOOOUND! ");   //received fine
                paint = mPlayer1Paint;
            }else {
                paint = mBGPaint;
            }
            canvas.drawRect(cx, cy, oneSide + (cx), oneSide + (cy), paint);
        }
        System.out.println("");
    }
    System.out.println("SETUP VIEW ARRAY END");   
    
  4. 我游戏类中的
  5. placedCell方法

        mainActivity.setRow(row);
        mainActivity.setCol(column);
    
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                int flag = gameGrid[row][column];
                if(i == column && j == row){
                    if(flag > 0){ //because unedited places is 0, edited places are more than 0
                        gameGrid[row][column] = flag;
                    }
                } } }
        return gameGrid[row][column];
    

我的问题是我的视图类无法从我的游戏类中获取更改后的数组(gameGrid)。我试图打印数组以检查它是否正确更改了。 我还声明了Game类中的数组为静态数组,但没有任何改变。 任何帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

  • 为了在View类中进行更改,一种方法是传递 整个视图类对您要在其中更改数组gameGrid的Game类的引用。

  • 然后,您可以在更新数组时调用view.invalidate()重新绘制网格。 invalidate()将再次调用视图类的onDraw()方法。

您可以在游戏类的构造函数中传递视图引用-

MyGameView mView; 
    public Game(MyGameView view)
    {
    mView=view;
     ...
    }

或者在Game类内创建一个方法,以在创建视图后设置mView的值-

public void setViewReference(MyGameView view)
{
mView=view;
}

现在,在View类中创建一个公共方法,该方法将接收更新的数组并再次重绘整个网格-

public void update(int [][] updatedGameGrid) //Assuming the array is int. Change the datatype is its not an int array
{
   gameGrid=updatedGameGrid; //Here gameGrid is the array inside your view class
   invalidate(); // Redraw the entire View (grid) again by calling onDraw()
}

现在,在您的Game类中,您可以更新数组并将其传递给视图类

public void update() 
{
 ... //Place you code to update the gameGrid array
 mView.update(gameGrid); //Pass the array to view class
}