【问题标题】: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 秒后它们被添加回来,这就是为什么我希望你可以发布等于代码。

标签: android google-maps google-maps-markers cluster-computing markerclusterer


【解决方案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 - 如果他们曾经“移动”,那么您将永远不会删除它们 - 您的逻辑仅适用于添加/删除它们的情况,可能是这种情况。
猜你喜欢
  • 2012-11-06
  • 1970-01-01
  • 2019-03-07
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 2021-03-26
  • 2016-01-16
相关资源
最近更新 更多