ArrayList.clear()正在更新List<>的先前值

时间:2016-02-24 07:25:26

标签: java android arraylist

我从服务器获得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<>();时,一切都按预期进行。

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

4 个答案:

答案 0 :(得分:5)

因为每次你在循环中对arraylist进行电话会议时,请尝试在 onCreate();

中对arraylist进行电话投放
coordinatesList = new ArrayList<>();

答案 1 :(得分:2)

这是在我们的onCreate方法中初始化的,一旦将活动推送到backstack,将会调用该方法。 ArrayList<HashMap<String, LatLng>> coordinatesList;

现在,您的coordinatesList实例在Class / Activity中有效。

因此,如果要在调用coordinateList实现函数时始终获得新结果,则需要重新初始化ArrayList对象或清除它以获得新结果。

答案 2 :(得分:0)

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

将相同的coordinatesList添加到areaList并不复制元素,它只是添加对现有列表的引用。

答案 3 :(得分:0)

以下内容应该有效

public void onCreate(Bundle b){
    super(b);

    parseResponse();
}

private final void parseResponse(){

    areaList = new ArrayList<ArrayList<HashMap<String, LatLng>>>>(jsonArray.length());
    for(int i=0;i<areaList.size();i++){

        List<HashMap<String,LatLng>> 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.set(i,coordinatesList);
}

注意: JSON数组的长度与areaList的长度相同,因此我们可以在解析时将areaList初始化为相同的长度。这比初始化默认大小的ArrayList

更有效

代码审核:

这段代码是不可读的:

ArrayList<HashMap<String, LatLng>> coordinatesList; 
List<ArrayList<HashMap<String, LatLng>>> areaList; 

我认为如果你声明一个封装了相关细节的Area类会更加清晰。例如:

public class Area{
   private String name;
   private List<LatLng> coordinates; 

   public Area(String name, List<LatLng> coordinates){//...}
}

然后,这会将您的活动中的代码减少为:

List<Area> areaList; 

private final void parseResponse(){

    areaList = new ArrayList<Area>(jsonArray.length());
    for(int i=0;i<areaList.size();i++){

        List<LatLng> coordinatesList = new ArrayList<>();
        //  parsing of json and other non-related stuff
        // Getting area_name and coordinates from json

         areaList.add(new Area(areaName,coordinatesList));
    }

}