自定义对象的ArrayList被“错误地”更新

时间:2015-08-19 06:50:35

标签: android class arraylist

我有一个名为Player的自定义对象的ArrayList。 ArrayList显示在RecyclerView中 - 效果很好。我在每个TextView的RecyclerAdapter中添加了一个onClick,传递了我的ArrayList,点击的列和点击的行 - 工作也非常好。

我让用户输入此“单元格”的分数 - 并尝试更新我的ArrayList。 问题是,为ArrayList中的所有玩家设置了分数。 RecyclerView“正确”获取更新 - 每个玩家都有ArrayList中显示的分数。我究竟做错了什么? :/

public class Player{
    String name;
    int[] sections = new int[16]; 

    public Player() {
        super();
    }

    public Player(String name, int[] sections) {
        super();
        this.name = name;
        this.sections = sections;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public int getPoints(int section){
        return sections[section];
    }

    public void setPoints(int section, int punkte){
        this.sections[section] = punkte;
    }

    public int[] getAllPoints(){
        return sections;
    }
}

我在第二个活动的onCreate方法中创建了我的ArrayList spielerArrayList,从主活动中获取名称(ArrayList spielernamen):

public void getData() {
        int[] foo = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
        if (spielernamen != null) {
            for (String spielername : spielernamen) {
                spielerArrayList.add(new Player(spielername, foo));
            }
        } else {
            Toast.makeText(this, "error", Toast.LENGTH_SHORT).show();
        }
    }

和我的方法中的一个代码段,名为onItemClick :(问题似乎在这里或在Player类中)

Player spieler = playerArrayList.get(column)

punkte = numberPicker.getValue();
spieler.setPoints(row, punkte); 
playerArrayList.set(column, spieler);

问题似乎在于这一点。我很久以前得到了Player对象并设置了AlertDialog,如果这改变了我将发布整个代码的任何内容。 我也尝试了这个,但错误仍然存​​在 - 每个Player对象都获得输入的分数。

Player spieler = playerArrayList.get(column)

punkte = numberPicker.getValue();
int[] pointsarray = spieler.getAllPoints();
pointsarray[row] = punkte;
Player player = new Player(spieler.getName(), pointsarray);
playerArrayList.remove(column);
playerArrayList.add(column, player);

告诉我您是否需要更多代码或其他内容。 :)

1 个答案:

答案 0 :(得分:0)

似乎所有Player对象都引用了同一个数组对象。因此,当您修改其中一个对象时,将修改所有对象。尝试初始化Player对象

public void getData() {
    int[] foo = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    if (spielernamen != null) {
        for (String spielername : spielernamen) {
            // here, each Player object have same member array object foo
            spielerArrayList.add(new Player(spielername, foo));
        }
    } else {
        Toast.makeText(this, "error", Toast.LENGTH_SHORT).show();
    }
}

修改为:

public void getData() {
    if (spielernamen != null) {
        for (String spielername : spielernamen) {
            // here, each Player object have same member array object foo
            int[] foo = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
            spielerArrayList.add(new Player(spielername, foo));
        }
    } else {
        Toast.makeText(this, "error", Toast.LENGTH_SHORT).show();
    }
}