目前正在开发具有500多个标记的android移动应用程序。我正在使用标记聚类功能,以便提供谷歌地图的清晰视图。我已经实现了ClusterItem和DefaultClusterRenderer类。
ClusterItem类提供标记簇功能,DefaultClusterRenderer提供除默认红色气球之外的自定义图标。
一旦我实现了DefaultClusterRenderer类并只更改了图标,就会出现以下错误。它一开始是正确登录的,但一旦我尝试缩放地图,就会出现错误。
Logcat指向类的默认实现Logcat输出如下
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)
它指向默认的实现,有没有办法解决这个问题?
显然这是谷歌地图Utils库中的一个错误,你可以从这里看到相关的线程
在他们发布新版本之前,我找到了一个变通办法。正如您提到的,您实现了DefaultClusterRenderer类。若并没有像我一样重写onClusterUpdatedItem方法,请使用库中正确版本的代码重写此方法。
如果您使用的是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()
}
}
至少这个小的变通方法解决了这个问题,直到他们发布下一个版本。
编辑:我还建议您离开Google Maps Utils库,使用此库进行聚类。它更合适,速度更快。
我也有同样的问题,我找到了一个解决方案。每次都重新创建ClusterManager。我知道它不能解决问题,但你不会出错。
使用Kotlin,在DefaultClusterRenderer中重写onClusterUpdated方法,如下所示:
override fun onClusterUpdated(cluster: Cluster<MyModel>, marker: Marker) {}
它对我有用!