我从服务器获得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<>();
时,一切都按预期进行。
有人可以详细说明,为什么会这样?
答案 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));
}
}