Android 使用自定义图标时出现Google地图标记群集错误
目前正在开发带有500多个标记的android移动应用程序。我正在使用标记群集功能以清晰地查看google地图。我已经实现了ClusterItem和DefaultClusterRenderer类 ClusterItem类提供标记群集功能,DefaultClusterRenderer提供默认红色气球以外的自定义图标 一旦我实现了DefaultClusterRenderer类并更改了图标,它只会给我以下错误。它在开始时是正确登录的,但一旦我尝试缩放地图,就会出现错误 Logcat指向类的默认实现 Logcat输出如下Android 使用自定义图标时出现Google地图标记群集错误,android,google-maps,markerclusterer,markers,Android,Google Maps,Markerclusterer,Markers,目前正在开发带有500多个标记的android移动应用程序。我正在使用标记群集功能以清晰地查看google地图。我已经实现了ClusterItem和DefaultClusterRenderer类 ClusterItem类提供标记群集功能,DefaultClusterRenderer提供默认红色气球以外的自定义图标 一旦我实现了DefaultClusterRenderer类并更改了图标,它只会给我以下错误。它在开始时是正确登录的,但一旦我尝试缩放地图,就会出现错误 Logcat指向类的默认实现 L
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at com.google.maps.android.clustering.view.DefaultClusterRenderer.onClusterItemUpdated(DefaultClusterRenderer.java:789)
at com.google.maps.android.clustering.view.DefaultClusterRenderer$CreateMarkerTask.perform(DefaultClusterRenderer.java:973)
at com.google.maps.android.clustering.view.DefaultClusterRenderer$CreateMarkerTask.access$2000(DefaultClusterRenderer.java:934)
at com.google.maps.android.clustering.view.DefaultClusterRenderer$MarkerModifier.performNextTask(DefaultClusterRenderer.java:650)
at com.google.maps.android.clustering.view.DefaultClusterRenderer$MarkerModifier.handleMessage(DefaultClusterRenderer.java:621)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6501)
at java.lang.reflect.Method.invoke(Native Method)
它指向默认实现,你知道如何解决这个问题吗?我也有同样的问题,我找到了一个解决方案。每次重新创建ClusterManager。我知道它不能解决问题,但你不会有错误 我也有同样的问题,我找到了一个解决方案。每次重新创建ClusterManager。我知道它不能解决问题,但你不会有错误 显然这是Google Maps Utils库中的一个bug,您可以从 在他们发布新版本之前,我找到了一个解决办法。正如您所提到的,您实现了DefaultClusterRenderer类。如果您没有像我一样重写OnClusterUpdate方法,请使用库中正确版本的代码重写此方法 如果您使用的是java
protected void onClusterItemUpdated(T item, Marker marker) {
boolean changed = false;
// Update marker text if the item text changed - same logic as adding marker in CreateMarkerTask.perform()
if (item.getTitle() != null && item.getSnippet() != null) {
if (!item.getTitle().equals(marker.getTitle())) {
marker.setTitle(item.getTitle());
changed = true;
}
if (!item.getSnippet().equals(marker.getSnippet())) {
marker.setSnippet(item.getSnippet());
changed = true;
}
} else if (item.getSnippet() != null && !item.getSnippet().equals(marker.getTitle())) {
marker.setTitle(item.getSnippet());
changed = true;
} else if (item.getTitle() != null && !item.getTitle().equals(marker.getTitle())) {
marker.setTitle(item.getTitle());
changed = true;
}
// Update marker position if the item changed position
if (!marker.getPosition().equals(item.getPosition())) {
marker.setPosition(item.getPosition());
changed = true;
}
if (changed && marker.isInfoWindowShown()) {
// Force a refresh of marker info window contents
marker.showInfoWindow();
}
}
或者如果你正在使用Kotlin
override fun onClusterItemUpdated(item: YOUR_MARKER_ITEM_CLASS?, marker: Marker?) {
var changed = false
// Update marker text if the item text changed - same logic as adding marker in CreateMarkerTask.perform()
// Update marker text if the item text changed - same logic as adding marker in CreateMarkerTask.perform()
if (item!!.title != null && item!!.snippet != null) {
if (!item!!.title.equals(marker!!.title)) {
marker!!.title = item!!.title
changed = true
}
if (!item!!.snippet.equals(marker!!.snippet)) {
marker!!.snippet = item!!.snippet
changed = true
}
} else if (item!!.snippet != null && !item!!.snippet.equals(marker!!.title)) {
marker!!.title = item!!.snippet
changed = true
} else if (item!!.title != null && !item!!.title.equals(marker!!.title)) {
marker!!.title = item!!.title
changed = true
}
// Update marker position if the item changed position
// Update marker position if the item changed position
if (!marker!!.position.equals(item!!.position)) {
marker!!.position = item!!.position
changed = true
}
if (changed && marker!!.isInfoWindowShown) {
// Force a refresh of marker info window contents
marker!!.showInfoWindow()
}
}
至少在他们发布下一个版本之前,这个小解决方案解决了这个问题
编辑:
我还建议您离开GoogleMapsUtils库,使用该库进行集群。它更合适,速度更快 显然这是Google Maps Utils库中的一个bug,您可以从 在他们发布新版本之前,我找到了一个解决办法。正如您所提到的,您实现了DefaultClusterRenderer类。如果您没有像我一样重写OnClusterUpdate方法,请使用库中正确版本的代码重写此方法 如果您使用的是java
protected void onClusterItemUpdated(T item, Marker marker) {
boolean changed = false;
// Update marker text if the item text changed - same logic as adding marker in CreateMarkerTask.perform()
if (item.getTitle() != null && item.getSnippet() != null) {
if (!item.getTitle().equals(marker.getTitle())) {
marker.setTitle(item.getTitle());
changed = true;
}
if (!item.getSnippet().equals(marker.getSnippet())) {
marker.setSnippet(item.getSnippet());
changed = true;
}
} else if (item.getSnippet() != null && !item.getSnippet().equals(marker.getTitle())) {
marker.setTitle(item.getSnippet());
changed = true;
} else if (item.getTitle() != null && !item.getTitle().equals(marker.getTitle())) {
marker.setTitle(item.getTitle());
changed = true;
}
// Update marker position if the item changed position
if (!marker.getPosition().equals(item.getPosition())) {
marker.setPosition(item.getPosition());
changed = true;
}
if (changed && marker.isInfoWindowShown()) {
// Force a refresh of marker info window contents
marker.showInfoWindow();
}
}
或者如果你正在使用Kotlin
override fun onClusterItemUpdated(item: YOUR_MARKER_ITEM_CLASS?, marker: Marker?) {
var changed = false
// Update marker text if the item text changed - same logic as adding marker in CreateMarkerTask.perform()
// Update marker text if the item text changed - same logic as adding marker in CreateMarkerTask.perform()
if (item!!.title != null && item!!.snippet != null) {
if (!item!!.title.equals(marker!!.title)) {
marker!!.title = item!!.title
changed = true
}
if (!item!!.snippet.equals(marker!!.snippet)) {
marker!!.snippet = item!!.snippet
changed = true
}
} else if (item!!.snippet != null && !item!!.snippet.equals(marker!!.title)) {
marker!!.title = item!!.snippet
changed = true
} else if (item!!.title != null && !item!!.title.equals(marker!!.title)) {
marker!!.title = item!!.title
changed = true
}
// Update marker position if the item changed position
// Update marker position if the item changed position
if (!marker!!.position.equals(item!!.position)) {
marker!!.position = item!!.position
changed = true
}
if (changed && marker!!.isInfoWindowShown) {
// Force a refresh of marker info window contents
marker!!.showInfoWindow()
}
}
至少在他们发布下一个版本之前,这个小解决方案解决了这个问题
编辑:
我还建议您离开GoogleMapsUtils库,使用该库进行集群。它更合适,速度更快 使用Kotlin,在DefaultClusterRenderer中重写OnClusterUpdate方法,如下所示:
override fun onClusterUpdated(cluster: Cluster<MyModel>, marker: Marker) {}
这对我有用 使用Kotlin,在DefaultClusterRenderer中重写OnClusterUpdate方法,如下所示:
override fun onClusterUpdated(cluster: Cluster<MyModel>, marker: Marker) {}
这对我有用 好像有个虫子。好像有个虫子。