0

我正在开发一个 Android 应用程序,其中谷歌地图有不同类别的位置标记。例如,收集当前位置附近的访问地点的标记和收集到目前为止访问的地点的标记。

我发现地图上的所有标记都可以使用 Listeners 设置

GoogleMap.setOnMarkerClickListener(OnMarkerClickListener)

但是,我有一组标记

ArrayList<Marker> markerList1 
ArrayList<Marker> markerList2

我想用一个监听器在markerList1中设置标记,用另一个监听器在markerList2中设置标记。请帮助我找到最好的方法来做到这一点。

4

2 回答 2

1

如果您只有两个这样的列表,那么直接的方法是

if (markerList1.contains(marker)) {
    doFirstAction(marker);
} else {
    doSecondAction(marker);
}

在 onMarkerClick 里面。

但是 contains 是线性搜索,因此如果单个列表中的标记数量很大并且您有两个以上的类别,或者类别的数量将来可能会发生变化,我建议改用单个 Map,例如

private Map<Marker, OnMarkerClickListener> allMarkers;

// in onCreate
OnMarkerClickListener firstActionListener = new ...
OnMarkerClickListener secondActionListener = new ...

Marker marker = ...
allMarkers.put(marker, firstActionListener);

// in global onMarkerClickListener
return allMarkers.get(marker).onMarkerClick(marker);

这样您就拥有了单独的侦听器,代码是最佳的,并且遵循开放/封闭原则:如果添加新类别,则不会更改现有代码。

于 2013-07-27T11:56:35.523 回答
1

该方法OnMarkerClickListener是为地图对象设置的,不能在标记或标记组级别设置。这意味着public boolean onMarkerClick(final Marker marker)单击地图上的任何标记都会触发相同的操作。

现在要处理不同类型标记的点击,您需要if else在此函数中使用逻辑。marker.getTitle() or marker.getSnippet()您可以通过可能检查某些字符串匹配的详细信息或通过检查包含有关标记的更多详细信息的 hashmap 或 sqlite db 条目来识别标记所属的组。

于 2013-07-27T04:43:48.767 回答