循环阵列到绘图标记

时间:2014-11-05 09:19:19

标签: java arrays json loops map

我有一个包含3个对象的数组的JSON。因此,当我检索事件JSON()时,我只是将属性设置为Event对象。当我从另一个活动调用plotEventOnMap()时,我希望在地图上看到3个标记​​。

public void retrieveEventJSON() throws JSONException {
    String page;
    JSONArray jsonArray;

    try {
        // Code to retrieve data from servlet
        try {
            JSONObject jsonObject = new JSONObject(page);
            jsonArray = jsonObject.getJSONArray("Events");
            int length = jsonArray.length();
            for (int i = 0; i < length; i++) {
                JSONObject attribute = jsonArray.getJSONObject(i);
                String eventID = attribute.getString("eventID");
                String eventName = attribute.getString("eventName");
                String eventDesc = attribute.getString("eventDesc");
                String eventDate = attribute.getString("eventDate");

                eventModel.setEventID(eventID);
                eventModel.setEventName(eventName);
                eventModel.setEventDesc(eventDesc);
                eventModel.setEventDate(eventDate);

            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void plotEventOnMap(Context context) {
    graphicIcon = new PictureMarkerSymbol(res);
    Point p = new Point(Double.parseDouble(eventModel.getEventX()),
            Double.parseDouble(eventModel.getEventY()));
    Symbol symbol = graphicIcon;

    HashMap<String, Object> attrMap = new HashMap<String, Object>();
    attrMap.put("eventName", eventModel.getEventName());
    attrMap.put("eventBy", eventModel.getEventBy());

    ENeighbourhoodActivity.graphicsLayer.addGraphic(new Graphic(p, symbol,
            attrMap));
}

但是使用这些代码,它只显示我的JSON中的最后一行记录而不是循环并绘制每一行。任何指南?

提前致谢。

2 个答案:

答案 0 :(得分:0)

在设置了所有.plotEventOnMap()属性后,您需要从循环内部调用EventModel或以其他方式对您构建的EventModel执行某些操作。目前,您只是在不使用它的情况下覆盖EventModel

for (int i = 0; i < length; i++) {
    JSONObject attribute = jsonArray.getJSONObject(i);
    String eventID = attribute.getString("eventID");
    String eventName = attribute.getString("eventName");
    String eventDesc = attribute.getString("eventDesc");
    String eventDate = attribute.getString("eventDate");

    eventModel.setEventID(eventID);
    eventModel.setEventName(eventName);
    eventModel.setEventDesc(eventDesc);
    eventModel.setEventDate(eventDate);
}

在循环结束之前,您需要对现在构建的EventModel做一些事情。这可能是绘制它,或将其添加到某个集合,或其他任何东西。但此刻,你将直接回到循环中,然后在下一次迭代中,覆盖你已完成的所有好工作。您最后一次完成最后一次迭代的原因是eventModel中剩下的内容是您上次通过时所写的内容循环。

事实上我认为你也想要

EventModel eventModel = new EventModel();

作为循环中的第一件事。 (我不知道这是否完全正确,因为我们还没有看到EventModel的代码所以我不知道构造函数的样子。)如果你想保留一个List(或类似)所有这些,您需要确保它们是所有不同的实例。

我建议像这样重铸:

List<EventModel> events = new ArrayList<EventModel>();     //NEW
for (int i = 0; i < length; i++) {
    EventModel eventModel = new EventModel();              //NEW
    JSONObject attribute = jsonArray.getJSONObject(i);
    String eventID = attribute.getString("eventID");
    String eventName = attribute.getString("eventName");
    String eventDesc = attribute.getString("eventDesc");
    String eventDate = attribute.getString("eventDate");

    eventModel.setEventID(eventID);
    eventModel.setEventName(eventName);
    eventModel.setEventDesc(eventDesc);
    eventModel.setEventDate(eventDate);
    events.add(eventModel);                                //NEW
}

循环完成后,您将拥有一个EventModel的列表,您可以将其发送到您的绘图方法或其他任何合适的位置。

答案 1 :(得分:0)

eventModel.setEventName(eventName);返回添加到其中的最新元素,因为在每次重复时都要重置它。

您可以在每次迭代后将对象添加到列表中,以便列表具有元素。在for循环中声明你的EventModel对象以获得每次迭代的实例。

           for (int i = 0; i < length; i++) {
                JSONObject attribute = jsonArray.getJSONObject(i);
                String eventID = attribute.getString("eventID");
                String eventName = attribute.getString("eventName");

              EventModel eventModel=new eventModel();
                eventModel.setEventID(eventID);
                eventModel.setEventName(eventName);

               list.add(eventModel);
            }