Android Java数组列表在每次迭代时添加相同的对象

时间:2015-02-26 08:22:13

标签: java android for-loop

我面临一个非常奇怪的问题。我有一个存储在解析服务器中的4条记录,我从解析中检索列表,我的代码看起来像这样:

    query.findInBackground(new FindCallback<ParseObject>() {

        @Override
        public void done(List<ParseObject> objects, ParseException e) {
            List<Spot> list = new ArrayList<Spot>();
            spot s;
            int index = 0;
            for (ParseObject o : objects) {
                s=jsonToSpot(o);
                list.add(s);
                Log.d("app",list.get(index).getLatLng.toString()); // return the coordinate of spot object
                index++;




            }
            Log.d("app",list.get(1).getLatLng.toString());
            Log.d("app",list.get(2).getLatLng.toString());
            Log.d("app",list.get(3).getLatLng.toString());
            Log.d("app",list.get(4).getLatLng.toString());
            getAllListener.done(list);
        }
    });


private Spot jsonToSpot(ParseObject o) {
    Log.d("app", "Model jsonToSpot");
    Spot s = new Spot(o.getDouble("latitude"), o.getDouble("longitude"));
    return s;
}

现在问题是我在for循环中的日志运行良好,这意味着它每次迭代都会打印不同的Spot。但循环后发生的日志会打印相同的Spot,这意味着列表中的每个销售都包含相同的位置。

我无法理解出了什么问题,感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

spot s;
int index = 0;
for (ParseObject o : objects) {
    s=jsonToSpot(o);
    list.add(s);
    Log.d("app",list.get(index).getLatLng.toString()); // return the coordinate of spot object
    index++;
}

基本上您正在做的是,您将s的引用存储到最后,并且您不断更改引用中的值。你应该在循环中做的是,每次在循环中创建一个新的Spot并将Spot存储到列表中。

int index = 0;
for (ParseObject o : objects) {
    Spot s = jsonToSpot(o);
    list.add(s);
    Log.d("app",list.get(index).getLatLng.toString()); // return the coordinate of spot object
    index++;
}

上面的代码段会帮助您。

答案 1 :(得分:0)

不是解决方案,而是建议。你不能使用它需要的1,2,3,4到0,1,2,3。您需要使用零偏移。记录的后半部分可能是:

for(int i=0;i<list.size;i++) {
    Log.d("app", "index: " + i + ", value: " + list.get(i).getLatLng.toString());
}

此外,检查getLatLng()并查看它是否返回正确的值可能会很好。