【问题标题】:Parsing JSON data to Map markers, all markers showing the same info, how can I fix this?将 JSON 数据解析为地图标记,所有标记都显示相同的信息,我该如何解决这个问题?
【发布时间】:2014-01-22 05:45:05
【问题描述】:

需要一些帮助。

我有一些商店和商店信息的 JSON,例如他们的名称、ID 和位置。我把它解析成一个ArrayList。

通过 AsyncTask,我将它们绘制在地图上。目前,这是4家商店。我覆盖了标记 onClick 以按照我想要的方式显示数据。我遇到的问题是,尽管标记根据经度和纬度位于正确的位置,但其他信息却不是。

当我点击一个标记时,所有这些标记上都列出了相同的商店名称。它只显示我的 JSON 中的最后一家商店。所有数据都来自我 JSON 中的最后一家商店。这是我的 onPostExecute() 代码:

@Override
protected void onPostExecute(ArrayList<ShopArray> shopArray) {
    super.onPostExecute(shopArray);

    for (ShopArray shopArrayOb : shopArray) {
        double lat = shopArrayOb.geo_lat;
        double lng = shopArrayOb.geo_lng;

        final String barName = shopArrayOb.bar_name;

        LatLng shopLocations = new LatLng(lat, lng);

        MarkerOptions marker = new MarkerOptions()
            .position(shopLocations)
            gMap.addMarker(marker);

        gMap.setOnMarkerClickListener(new OnMarkerClickListener() {
                @Override
            public boolean onMarkerClick(Marker marker) {

                testText.setText(barName);

                return false;
            }

        });
    }

我真的不知道如何解决这个问题。我只希望它显示标记的正确名称以及其他数据。它一直在我的 JSON 中显示来自最后一家商店的数据,仅此而已。如果您需要查看我的更多代码,请告诉我,我会更新我的帖子。

非常感谢您对此的帮助,在此先感谢!

编辑:我刚刚使用默认标记 onClick 进行了测试。 (.title 和 .sn-p),它奏效了!它显示了正确的信息! 那么有没有办法获得自定义的 onClick 呢?看起来是 setOnMarkerListener 引起了问题。

【问题讨论】:

    标签: java android json google-maps android-asynctask


    【解决方案1】:

    这是因为您在同一 gMap 对象上多次调用 setOnMarkerClickListener()。这样上一个调用就生效也就不奇怪了,会使用上一个店铺的信息。您应该只设置一次OnMarkerClickListener。当然,那么你必须在它的onMarkerClick() 方法中识别你的标记来决定哪个商店被点击了。

    【讨论】:

    • 感谢您的解释,如果我调用 gMap.setOnInfoWindowClickListener,您认为这会解决这个问题吗?我只有一个标记来识别(标记)我假设它已经是被调用的那个。现在只是想弄清楚我的下一步,因为单击标记时我仍然想要自定义输出。
    • 没有。地图上有 4 个标记,每个咖啡店一个。但是你只有一个 OnMarkerClickListener 传递给你一个被点击的标记(查看参数)。在这里你必须检测点击了哪个咖啡店。
    • 啊,我明白了。有没有办法做到这一点,以便每次我在服务器上的 JSON 中添加新商店时都不必更新我的代码?你说得好像我必须单独调用每个标记,即使我再添加 20 或 30 个。
    【解决方案2】:

    您可以将所有标记放在 HashMap 中:

    //somewhere befor async task    
    HashMap<LatLng, String> map = new HashMap<LatLng, String>();
    

    然后给它添加标记:

    //in your post execute
    map.put(shopLocations, barName);
    

    然后在你的听众中:

    gMap.setOnMarkerClickListener(new OnMarkerClickListener() {
                @Override
            public boolean onMarkerClick(Marker marker) {
    
                testText.setText(map.get(marker.getPosition()));
    
                return false;
            }
    
        });
    

    【讨论】:

    • 这仍然显示了列表中的最后一家商店。我在我的课程一开始就调用了 HashMap(一个片段),并且在我设置标记之后和 onClick 之前调用了 map.put() 位。
    • 你能再解释一下吗?我觉得这是正确的路线,但我似乎无法让它发挥作用。
    • 是的,这是正确的路线。由于我已经告诉过您,它显示了最后一个标记:将 gMap.setOnMarkerClickListener() 调用移出 for(){} 块!每次添加新标记时不要更改地图的 OnMarkerClickListener!在代码末尾只调用一次!
    • 不要使用LatLng 作为键。有a bug in the library,可能会导致它无法正常工作。
    • @ÁronNemmondommegavezetéknevem 我已将 setOnMarkerClickListener() 移到 for 循环之外,它仍在我的 onPostExecute() 中。使用 HashMap 我仍然可以获得最后的商店信息,因此它必须多次调用 onClick。我真的很感激你可能有的任何建议。感谢您帮助顺便说一句。我仍然使用 LatLng 作为键,因为数据都是基于位置的。如果我不能使用它,我不知道该怎么办。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2016-06-23
    相关资源
    最近更新 更多