【问题标题】:Adding markers to a hashmap without adding them to the map将标记添加到哈希映射而不将它们添加到映射
【发布时间】:2016-03-10 15:47:54
【问题描述】:

我想在这个哈希图中添加谷歌地图标记:

private HashMap<Marker, MyMarker> mMarkersHashMap;

不将它们添加到谷歌地图。这是我目前拥有的代码:

MarkerOptions markerOption = new MarkerOptions().position(new LatLng(myMarker.getmLatitude(), myMarker.getmLongitude()));
Marker currentMarker = mMap.addMarker(markerOption);
mMarkersHashMap.put(currentMarker, myMarker);

此代码将标记添加到哈希映射,但也将标记添加到映射(使用 addMarker),这是我不想要的。任何建议

这是我正在处理的功能:

private void plotMarkers(ArrayList<MyMarker> markers)
    {
        if(markers.size() > 0)
        {
            for (final MyMarker myMarker : markers)
            {
                MarkerOptions markerOption = new MarkerOptions().position(new LatLng(myMarker.getmLatitude(), myMarker.getmLongitude()));

                Marker currentMarker = mMap.addMarker(markerOption);
                //Passes markers into hashmap so they can be used by the information window methods
                mMarkersHashMap.put(currentMarker, myMarker);

                mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
                    @Override
                    public void onInfoWindowClick(Marker marker) {
                        Intent ListIntent = new Intent(getApplicationContext(), InfoWindowList.class);
                        MyMarker myMarker = mMarkersHashMap.get(marker);
                        String title = myMarker.getmLabel();
                        ListIntent.putExtra("COUNTY", title);
                        startActivity(ListIntent);
                    }
                });

                mMap.setInfoWindowAdapter(new MarkerInfoWindowAdapter());
            }

        }
        mClusterManager.addItems(markers);
    }

我希望mClusterManager.addItems(markers); 将标记添加到地图中。

这是我的信息窗口函数,它需要哈希图在哈希图中的标记上设置信息窗口:

public class MarkerInfoWindowAdapter implements GoogleMap.InfoWindowAdapter
    {
        public MarkerInfoWindowAdapter()
        {
        }

        @Override
        public View getInfoWindow(Marker marker)
        {
            return null;
        }

        @Override
        public View getInfoContents(Marker marker)
        {

            View v  = getLayoutInflater().inflate(R.layout.infowindow_layout, null);
            MyMarker myMarker = mMarkersHashMap.get(marker);

            ImageView markerIcon = (ImageView) v.findViewById(R.id.marker_icon);
            TextView markerLabel = (TextView)v.findViewById(R.id.marker_label);
            TextView anotherLabel = (TextView)v.findViewById(R.id.another_label);
            //anotherLabel.setOnClickListener(newsfeed);

            markerIcon.setImageResource(manageMarkerIcon(myMarker.getmIcon()));
            anotherLabel.setText("Newsfeed");
            markerLabel.setText(myMarker.getmLabel());

            return v;

        }
    }

MyMarker 类:

public class MyMarker implements ClusterItem {
    private String mLabel;
    private String mIcon;
    private Double mLatitude;
    private Double mLongitude;
    private final LatLng mPosition;

    public MyMarker(String label, String icon, Double latitude, Double longitude)
    {
        this.mLabel = label;
        this.mLatitude = latitude;
        this.mLongitude = longitude;
        this.mIcon = icon;
        mPosition = new LatLng(latitude, longitude);
    }

    //mPosition = LatLng(mLatitude, mLongitude);
    @Override
    public LatLng getPosition() {
        return mPosition;
    }

    public String getmLabel()
    {
        return mLabel;
    }

    public void setmLabel(String mLabel)
    {
        this.mLabel = mLabel;
    }

    public String getmIcon()
    {
        return mIcon;
    }

    public void setmIcon(String icon)
    {
        this.mIcon = icon;
    }

    public Double getmLatitude()
    {
        return mLatitude;
    }

    public void setmLatitude(Double mLatitude)
    {
        this.mLatitude = mLatitude;
    }

    public Double getmLongitude()
    {
        return mLongitude;
    }

    public void setmLongitude(Double mLongitude)
    {
        this.mLongitude = mLongitude;
    }
}

【问题讨论】:

  • 只是不要在地图上添加标记,只在 hashmap 上添加标记,您可以发布更多课程代码。
  • 我知道这是我必须做的,我想知道它是如何完成的。是的,我现在将添加更多代码

标签: java android google-maps google-maps-api-3


【解决方案1】:

当您将MarkerOptions 提供给地图并调用addMarker 时会创建一个“标记”,因此如果不先将其添加到地图中,您将无法获得标记。

如果您只是想让标记不可见,请更改其可见性

【讨论】:

  • 当我点击地图时,这给了我一个错误。尝试在空对象引用上调用虚拟方法“java.lang.String com.example.cillin.map.MyMarker.getmIcon()”
  • 它用于获取信息窗口的图标(图像)。我已将代码添加到问题中。
  • 您的地图点击或调用该方法的任何内容在哪里
  • plotMarkers 类内部
  • 我在plotMarkers 中没有看到引用getmIcon 的任何地方
【解决方案2】:

您可以将标记添加到地图,然后使用隐藏它

currentMarker.setVisible(false);

但不确定这是最有效的路线。取决于您的用例。


根据评论编辑

如果您只需要维护一个HashMap 标记,您是否尝试过使用ClusterRenderer

这是一个例子:

clusterManager.setRenderer(new DefaultClusterRenderer<MyMarker>(activity, map, clusterManager) {
            @Override
            protected void onClusterItemRendered(MyMarker myMarker, Marker marker) {
                super.onClusterItemRendered(mobileMarker, marker);
                // add to hashmap here
            }

            ... override other methods as needed

        });

clusterManager.addItems(markers)

【讨论】:

  • 当我点击地图时,这给了我一个错误。尝试在空对象引用上调用虚拟方法“java.lang.String com.example.cillin.map.MyMarker.getmIcon()”
  • 你能分享MyMarker类吗?
  • 是的。我将其添加到问题的末尾。
  • 我猜每当您从Map 查找标记时,您会得到一个空引用,因此是 NPE。听起来你的算法有问题,但你至少想在MarkerInfoWindowAdapter.getInfoContents 内检查myMarker 是否为null
  • 另外,为什么要将标记添加到地图,然后再次将它们添加到ClusterManager?这不是两次创建相同的地图标记吗?那可能是你的 NPE 的来源
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
相关资源
最近更新 更多