21

基本上,当向地图添加标记时,它会返回新标记,您可以像这样从中获取标记 ID

Marker m = map.addMarker(new MarkerOptions()
                            .position(new LatLng(lat,lon)));
String id = m.getId();

如果有很多标记并且您只想删除一个,有没有办法通过它的 id 获取标记?

4

5 回答 5

39

我已经这样做了:

初始化变量

private GoogleMap mMap;
private HashMap<Marker, Integer> mHashMap = new HashMap<Marker, Integer>();
private ArrayList<MyCustomModelClass> myList = new ArrayList<MyCustomModelClass>();

使用您的arraylist谷歌地图上添加标记

for (int i = 0; i < myList.size(); i++) {
    double latitude = myList.getLatitude();
    double longitude = myList.getLongitude();
    Marker marker = mMap.addMarker(new MarkerOptions().position(new LatLng(latitude,longitude))).title(myList.getTitle())
                                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.location_icon));
    mHashMap.put(marker, i);
}  

标记单击侦听器上:

@Override
public boolean onMarkerClick(Marker marker) { 
    int pos = mHashMap.get(marker);
    Log.i("Position of arraylist", pos+"");
}

希望这会帮助你。

于 2015-04-22T11:25:13.460 回答
22

问题是标记 id 是自动生成的,不能用于单独跟踪标记。已经提出了许多策略来解决这个问题。一种是使用哈希映射来跟踪标记,然后使用您选择的键来查找特定标记并将其删除。另一个想法是重载一个标记字段,例如片段,然后自己添加一个键。例如,如果您正在制作一个新标记(使用 google 示例代码),您可以将自己的密钥字符串放入片段字段

mMap.addMarker(new MarkerOptions()                           
.position(MELBOURNE)                           
.title("Melbourne")                           
.snippet(KEY + "Population: 4,137,400"));

稍后您可以使用

String s = marker.getSnippet()
String key = s.substring(start, end)

如果匹配,则使用条件删除特定标记。根据你需要做什么,一种方法比另一种方法更容易、更有效。

于 2013-03-12T18:22:46.800 回答
13

我知道,已经很晚了。但是现在,我们可以直接将唯一的TAG添加到标记中。

Marker marker = mMap.addMarker(markerOptions);
marker.setTag("");

关于地图标记 TAG 的 Google Developers 链接

于 2018-09-06T06:17:14.740 回答
4

用于WeakHashMap<Integer,Marker>存储标记,因为通过这种方式,我们不会在内存中保留对标记的引用,也不必担心垃圾收集标记。

其次推荐的方法是使用带有 ID 和自定义数据的 WeakHashMap。文档说标记对象可能会改变,所以不要使用标记作为键。如果活动被杀死并恢复,但 ID 将保持不变。有时,如果标记对象更改,它也可能返回 null。

WeakHashMap<Integer,Marker> obj = new WeakHashMap <Integer,Marker>();

希望对以后的观众有帮助...

于 2016-02-12T13:07:31.630 回答
0

最好的方法是使用Map <int, Mark> dictionaryMark;.

每次绘制时只需将标记添加到字典中。

于 2014-11-17T09:43:27.187 回答