Ошибка Google Map Marker Cluster при использовании пользовательских значков - PullRequest
1 голос
/ 01 апреля 2020

В настоящее время разрабатывается android мобильное приложение с 500+ маркерами. Я использую функцию кластера маркеров, чтобы обеспечить четкое представление о карте 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)

указывает на значение по умолчанию реализация, есть идеи, как решить этот вопрос?

Ответы [ 2 ]

3 голосов
/ 07 апреля 2020

Видимо, это ошибка в библиотеке Google Maps 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 и используйте эту библиотеку для кластеризации. Это намного удобнее и быстрее.

0 голосов
/ 02 апреля 2020

У меня тоже такая же проблема, и я нашел 1 решение. Воссоздайте ClusterManager каждый раз. Я знаю, что это не решит проблему, но у вас не будет ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...