iappmaker
iappmaker

Reputation: 3005

Array List value changes even when it is not changed

In the Method updateMasterGrid(), 1st I am displaying the value from c.getBall. Source is quadCellGrid arraylist

2nd I am assigning the value from quadCellGrid to mastergrid

3rd I am displaying the c.getBall.Source is quadCellGrid arraylist

After assigning the value from quadCellGrid to mastergrid. I could see the change in the value in quadCellGrid. Please check the logcat output.

Could you please let me know how to resolve this.

public class BurstBalls { 

private boolean Q1Match,Q2Match,Q3Match,Q4Match;

private Texture RED_BALL;
private Texture BURST_STAR; 
private List<CellGrid> masterGrid;
private List<CellGrid> quadCellGrid  = new ArrayList<CellGrid>();  
private List<CellGrid> burstCellGrid = new ArrayList<CellGrid>();  
private SpriteBatch batch; 

private float scaleXY = 0.1f;

private int Q1Moves[][] = { { 0, 0 },{ -1, 0 }, { 0, 1 }, { -1, 1 } }; 
private int Q2Moves[][] = { { 0, 0 },{  1, 0 }, { 0, 1 }, {  1, 1 } }; 
private int Q3Moves[][] = { { 0, 0 },{  1, 0 }, { 0,-1 }, {  1,-1 } }; 
private int Q4Moves[][] = { { 0, 0 },{ -1, 0 }, { 0,-1 }, { -1,-1 } };  

public BurstBalls( ) {  
    setGameTextures();
}


public void draw(SpriteBatch sb){    
    batch=sb;  
    if(!burstCellGrid.isEmpty()){ 
        showImageZoom1(BURST_STAR, burstCellGrid.get(0).getColCoordinate()/2, burstCellGrid.get(0).getRowCoordinate()/2); 
    }
}

private void showImageZoom1(Texture t, int x, int y) {
    scaleXY = scaleXY + 0.05f;
    if (scaleXY >= 1.0){
        //burstCellGrid.clear();
        scaleXY = 1.0f;
    }
    Sprite s = new Sprite(t);
    s.setPosition(x, y);
    s.setScale(scaleXY);
    s.draw(batch);
}

public List<CellGrid> getMatchBallCells(int row, int col, Ball b, List<CellGrid> mGrid){  
    this.masterGrid=mGrid;
    Q1Match=false;
    Q2Match=false;
    Q3Match=false;
    Q4Match=false;

    quadCellGrid.clear();
    burstCellGrid.clear();

    if(row<(MainGame.ROW-1) && col >0){
        Q1Match = checkCells(b, row,col, Q1Moves);  
        System.out.println("Q1Match : " + Q1Match);
    }

    if(row<(MainGame.ROW-1) && col < (MainGame.COL-1)){ 
        Q2Match = checkCells(b,row,col, Q2Moves);   
        System.out.println("Q2Match : " + Q2Match);
    }

    if(row>0 && col< (MainGame.COL-1)){ 
        Q3Match = checkCells(b, row,col, Q3Moves);  
        System.out.println("Q3Match : " + Q3Match);
    }

    if(row>0 && col > 0){ 
        Q4Match = checkCells(b, row,col, Q4Moves);  
        System.out.println("Q4Match : " + Q4Match);
    }   
    if(Q1Match || Q2Match || Q3Match || Q4Match){ 
        updateMasterGrid();
    } 

    for (CellGrid c : burstCellGrid) {
        if(c.getBall()!=null){
            System.out.println("!Burst Cells - (c.getRow(),c.getCol) - " + "(" + c.getRow() +","+c.getCol() +")"); 
        }
    } 

    return masterGrid; 
}

private void updateMasterGrid() {
    for(CellGrid c: quadCellGrid){   
        System.out.println(" Before quadCellGrid.ball " +  c.getBall());   
        masterGrid.get(masterGrid.indexOf(c)).setBall(null); 
        System.out.println(" After  quadCellGrid.ball " +  c.getBall());   
    }  
}  

private boolean checkCells(Ball actionBall,int row,int col,int moves[][]) {  
    boolean firstCell = false,secondCell = false,thirdCell = false,fourthCell = false;
    CellGrid cellGrid=checkIfBallThere(row+moves[0][1],col+moves[0][0]);
    firstCell = checkBall(cellGrid,actionBall); 

    cellGrid=checkIfBallThere(row+moves[1][1],col+moves[1][0]);
    secondCell = checkBall(cellGrid,actionBall); 

    cellGrid=checkIfBallThere(row+moves[2][1],col+moves[2][0]);
    thirdCell = checkBall(cellGrid,actionBall); 

    cellGrid=checkIfBallThere(row+moves[3][1],col+moves[3][0]);
    fourthCell = checkBall(cellGrid,actionBall); 

    if(firstCell && secondCell && thirdCell && fourthCell){  
        return true;  
    } 
    return false;  
}

private boolean checkBall(CellGrid c, Ball actionBall) { 
    if(c!=null && c.getBall().getTexture().equals(actionBall.getTexture())){ 
        if (!quadCellGrid.contains(c)){ 
            quadCellGrid.add(c); 
        }
        return true;
    } 
    return false;
}  

public CellGrid checkIfBallThere(int cellRow, int cellCol ) {
    for (CellGrid c : masterGrid) {
        if (c.getRow() == cellRow && c.getCol() == cellCol
                && c.getBall() != null) {  
            return c;
        }
    }
    return null;
} 

private void setGameTextures() {
    RED_BALL = Texturemanager.RED_BALL;
    RED_BALL.setFilter(TextureFilter.Linear, TextureFilter.Linear);

    BURST_STAR = Texturemanager.BURST_STAR; 
    BURST_STAR.setFilter(TextureFilter.Linear, TextureFilter.Linear); 
}

}

Logcat

Before quadCellGrid.ball com.puzzle.game.ballpool.Ball@41414ed8
After  quadCellGrid.ball null
Before quadCellGrid.ball com.puzzle.game.ballpool.Ball@41415670
After  quadCellGrid.ball null
Before quadCellGrid.ball com.puzzle.game.ballpool.Ball@414155e0
After  quadCellGrid.ball null
Before quadCellGrid.ball com.puzzle.game.ballpool.Ball@41415628
After  quadCellGrid.ball null

Upvotes: 1

Views: 69

Answers (2)

Bohemian
Bohemian

Reputation: 425003

A List is a list of references. If you get a reference from one list and add it to another list, both lists have references to the same object.

If you get a reference to such an object and mutate it (set a field), the change will be reflected in the relevant element of both lists.

Upvotes: 1

Techfist
Techfist

Reputation: 4344

I dont know how you have populated mastergrid and quadcellgrid, but this line seems culprit to me.

masterGrid.get(masterGrid.indexOf(c)).setBall(null); 

You might be having same Cellgrid object instance stored in both MastCellGrid and Quadcellgrid, so upon printing it first, you make it null then printing it again which is printed as null.

Check or post you gird population logic.

Upvotes: 0

Related Questions