我正在从服务器获取JSONArray。我得到的JSON具有以下格式。

[ {
   "area_name":"abc",
   "coordinates":[
     {
     "lat":1.123,
     "lng":2.123,
     },
     {
     "lat":1.123,
     "lng":2.123,
     },
     .
     .
     ]
},
{
.
.
.
}
]


为了在地图上绘制区域,我将区域添加到areaList及其在coordinatesList中的相应坐标

ArrayList<HashMap<String, LatLng>> coordinatesList; // initialised in onCreate
List<ArrayList<HashMap<String, LatLng>>> areaList; // initialised in onCreate

for (int i = 0; i < areaArray.size(); i++) {
     coordinatesList.clear();
     //coordinatesList = new ArrayList<>();
     //  parsing of json and other non-related stuff

      for (int j =0; j < pointsArray.size(); j++) {
          // Getting data from json and saving to hashmap and adding to coordinatesList
          coordinatesList.add(pointsHashMap);
     }

     areaList.add(coordinatesList);
}


现在,如果我尝试从某个功能的areaList获取值。我对所有位置都得到相同的值。

log.d(TAG, "area " + areaList.get(i).get(0).get("lat_lng)); // its in a loop


对于i的任何值,我将得到areaList.add(coordinatesList);的最后一个附加值。 areaList中所有先前添加的值将被替换。

但是,当我评论coordinatesList.clear();和取消评论coordinatesList = new ArrayList<>();时,一切都会按预期进行。

有人可以详细说明一下,为什么会这样吗?

最佳答案

您肯定需要在循环中的每次迭代中向areaList添加一个新的ArrayList。现在,您每次通过循环都将相同的ordinatesList实例添加到areaList。同一实例在列表顶部被清除。

将相同的坐标列表添加到areaList不会复制元素,而只是将引用添加到现有列表。

07-24 09:48