删除旧地图标记并在集群管理器中加载新标记

Posted

技术标签:

【中文标题】删除旧地图标记并在集群管理器中加载新标记【英文标题】:Delete old map markers and load new ones in cluster manager 【发布时间】:2019-02-26 07:08:51 【问题描述】:

我有一个谷歌地图,我想做的是使用 geoQuery 每 15 秒刷新一次来自 firebase 的标记,这意味着我删除所有以前的标记并使用此方法添加新标记:

private void downloadExtraPrinters(LatLng viewCenter, int viewRadius) 

    try 

        final GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(viewCenter.latitude,viewCenter.longitude), viewRadius);
        geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() 
            @Override
            public void onKeyEntered(String key, GeoLocation location) 

                try
                    MyItem myItem = new MyItem(location.latitude, location.longitude);
                    if (!items.contains(myItem)) 
                        items.add(myItem);
                    

                catch (ClassCastException e)

                

            

            @Override
            public void onKeyExited(String key) 

            

            @Override
            public void onKeyMoved(String key, GeoLocation location) 

            

            @Override
            public void onGeoQueryReady() 

                parseJsonToList();
            

            @Override
            public void onGeoQueryError(DatabaseError error) 

            
        );
    catch (NullPointerException e)

    



parseJsonToList 方法:

private void parseJsonToList() 


itemss = clusterManagerAlgorithm.getItems();
try 
    items.removeAll(itemss);
catch (IndexOutOfBoundsException e)
    Log.d("itemsDoesn't exist"," : ");



mClusterManager.clearItems();      // I Think the problem is in this 3 lines of code.
mClusterManager.cluster();         // I also tried addItems(items) before clustering i still getting the same problem.
mClusterManager.addItems(items);


我的问题是每次我想清理和重新加载数据时,所有标记都会消失 15 秒,直到下一次调用 parseJsonToList 方法时,所有标记都会在 15 秒后再次出现。

@Override
protected void onStart() 
    super.onStart();

    timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() 
        @Override
        public void run() 
            Log.d("timer","executed");
             if (viewCenter != null) 
                downloadExtraPrinters(viewCenter, viewRadius);
                Log.d("download","newData");
            

        
    , 0, 15000);  // all data reloaded every 15s.

这里是 myItem 类:

public class MyItem implements ClusterItem 
private final LatLng mPosition;

public MyItem(double lat, double lng) 
    mPosition = new LatLng(lat, lng);


@Override
public LatLng getPosition() 
    return mPosition;


@Override
public boolean equals(Object o) 
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    MyItem item = (MyItem) o;
    return Objects.equals(mPosition, item.mPosition);


@Override
public int hashCode() 

    return Objects.hash(mPosition);


我想要的是立即更改标记而不会消失 15 秒。我在这个问题上苦苦挣扎了 2 周,请帮忙!

【问题讨论】:

发布 equals 的 MyItem 实现,或者注意它是否未被覆盖。 我已经覆盖了 myItem.class 中的 equals 和 hashCode -- Andy 对 - 所以如果你正在做类似比较 lat/lngs 的事情,那么问题是你删除所有内容,然后 15 秒后它们被添加回来,这就是为什么我希望你可以发布等于代码。 【参考方案1】:

假设 clusterManager 最初为空,并且初始地理查询返回单个结果 A。

parseJsonToList 的条目上,items 中有一个条目 (A) 和这一行:

itemss = clusterManagerAlgorithm.getItems();

返回一个空的Collection

既然itemss 是空的,那么

items.removeAll(itemss);

没有任何效果,其余代码会将 A 添加到地图中。

现在,15 秒后返回相同的结果 (A),这一行

itemss = clusterManagerAlgorithm.getItems();

返回一个集合,其中包含一个等同于 A(按位置(等于))和现在的项目

items.removeAll(itemss);

将删除当前结果 (A),因为它也在 itemss 中(同样由 equals 使用位置)。

那么当你在这一行添加items 时:

mClusterManager.addItems(items);

没有添加任何内容,因为 items 为空。

所以这种模式最有可能..

the marker appears
15 seconds later the marker disappears
15 seconds later the marker appears

我无法推荐解决方案,因为我不明白为什么最后会出现clearItems - 如果您真的想这样做,那么完全摆脱“删除”逻辑。并且文档确实建议在添加后强制集群。

【讨论】:

考虑到没有 clearItems 有什么解决方案是这种情况安迪? 在这种情况下,反转删除逻辑 - 从 itemss 中删除 items - 但由于没有“removeAll”,您将不得不遍历 itemsremoveItem .但这会回到您的equals - 如果他们曾经“移动”,那么您将永远不会删除它们 - 您的逻辑仅适用于添加/删除它们的情况,可能是这种情况。

以上是关于删除旧地图标记并在集群管理器中加载新标记的主要内容,如果未能解决你的问题,请参考以下文章

在 android 谷歌地图中更改集群管理器项目图标

如何在谷歌地图的集群中为标记设置我自己的图标

带有毕加索的谷歌地图集群项目标记图标

使用集群自定义谷歌地图上的标记

Google Maps Api v3 - 如何删除集群图标?

谷歌地图与集群管理器:不推荐使用 onCameraChangeListener