Android 使用自定义图标时出现Google地图标记群集错误

Android 使用自定义图标时出现Google地图标记群集错误,android,google-maps,markerclusterer,markers,Android,Google Maps,Markerclusterer,Markers,目前正在开发带有500多个标记的android移动应用程序。我正在使用标记群集功能以清晰地查看google地图。我已经实现了ClusterItem和DefaultClusterRenderer类 ClusterItem类提供标记群集功能,DefaultClusterRenderer提供默认红色气球以外的自定义图标 一旦我实现了DefaultClusterRenderer类并更改了图标,它只会给我以下错误。它在开始时是正确登录的,但一旦我尝试缩放地图,就会出现错误 Logcat指向类的默认实现 L

目前正在开发带有500多个标记的android移动应用程序。我正在使用标记群集功能以清晰地查看google地图。我已经实现了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)

它指向默认实现,你知道如何解决这个问题吗?

我也有同样的问题,我找到了一个解决方案。每次重新创建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) {}
这对我有用

好像有个虫子。好像有个虫子。