我正在开发一款安卓应用程序,谷歌地图上有不同类别位置的标记。例如,收集当前位置附近要访问的地方的标记,以及收集迄今为止访问过的地方的标志。
我发现地图上的所有标记都可以使用由监听器设置
GoogleMap.setOnMarkerClickListener(OnMarkerClickListener)
然而,我有一个标记的集合
ArrayList<Marker> markerList1
ArrayList<Marker> markerList2
并且我想在标记List1中用一个Listener设置标记,在标记List2中用另一个侦听器设置标记。请帮我找到最好的方法。
如果你只有两个这样的列表,一个直接的方法是进行
if (markerList1.contains(marker)) {
doFirstAction(marker);
} else {
doSecondAction(marker);
}
内部单击MarkerClick。
然而,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);
通过这种方式,您可以拥有独立的监听器,代码是最优的,并遵循开放/封闭原则:如果添加新的类别,则不会更改现有代码。
方法OnMarkerClickListener
是为映射对象设置的,不能在标记或标记组级别设置。这意味着单击地图上的任何标记都将触发相同的public boolean onMarkerClick(final Marker marker)
。
现在,要处理不同类型标记的单击,需要在此函数中使用if else
逻辑。您可以通过检查marker.getTitle() or marker.getSnippet()
等详细信息中的某些字符串匹配,或者通过检查包含标记更多详细信息的hashmap或sqlite-db条目来确定标记属于哪个组。