2016-02-24 2 views
0

Я получаю JSONArray с сервера. JSON Я получаю следующий формат.ArrayList.clear() обновляет предыдущие значения списка <>

[ { 
    "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<>(); все работает должным образом.

Может кто-то прокомментировать это, почему это происходит так?

+1

Добавление элемента в список массива не копирует его. Вы добавляете один и тот же список снова и снова. Просто объявите CoordList внутри цикла; создайте новую на каждой итерации. –

+0

ну, ах, это было довольно глупо от меня. Я думаю, что вся целая ночь за дело. –

ответ

0

Вам обязательно нужно добавить новый массив ArrayList в areaList каждой итерации через цикл. Прямо сейчас вы добавляете один и тот же экземпляр координатList в areaList каждый раз через цикл. Тот же самый экземпляр очищается вверху списка.

Добавление тех же координатList в areaList не копирует элементы, а просто добавляет ссылку на существующий список.

5

потому что каждый раз, когда вы обманываете арраиста в петле, пытайтесь обмануть архаиста в onCreate();

coordinatesList = new ArrayList<>(); 
+1

Да; но было бы лучше объявить его как локальную переменную, поэтому после завершения цикла вы не останетесь с содержимым последней итерации. –

2

Как это инициализируется в нашем onCreate метод, который будет вызываться после того, как деятельность выталкивается backstack. ArrayList<HashMap<String, LatLng>> coordinatesList;

Теперь экземпляр вашего списка координат действителен на всей территории вашего Class/Activity.

Итак, если вы хотите получать новые результаты все время при вызове вашей функции для реализации координатList, вам нужно повторно инициализировать объект ArrayList или очистить его, чтобы получить новые результаты, сложенные.

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)); 
    } 

} 
Смежные вопросы