【问题标题】:Loop Array to Plot Marker循环阵列以绘制标记
【发布时间】:2015-01-01 10:04:36
【问题描述】:

我有一个包含 3 个对象的数组的 JSON。因此,当我检索EventJSON() 时,我只是将属性设置为一个事件对象。当我从另一个活动中调用 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 中的最后一行记录,而不是循环并绘制每个记录。有指南吗?

提前致谢。

【问题讨论】:

  • eventModel是如何定义的?我认为这个对象只有一个实例,所以 json 数组中的最后一个对象获胜,这就是它只显示最后一行的原因。

标签: java arrays json loops map


【解决方案1】:

您需要调用.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
}

循环完成后,您将获得一个 EventModels 列表,您可以将其发送到您的绘图方法或任何适当的位置。

【讨论】:

  • 因为retrieveEventJSON 将在后台执行,而不是地图上的绘图标记。所以我在想是否应该声明另一个 Event 数组来存储 Event 对象。然后在 plot() 中,然后循环事件数组
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    相关资源
    最近更新 更多