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

9

我有一个谷歌地图,我想做的是使用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.
}

这里是我的Item类:

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周,请帮忙解决!


发布MyItem实现的“equals”或注明是否未被覆盖。 - user2711811
我已经在myItem类中覆盖了equals和hashCode方法 -- Andy - Brain Speller
好的 - 如果你正在做类似于在equals中比较lat/lngs的事情,那么问题就在于一次通过你会将所有东西都移除,然后15秒后它们又被添加回来了,这就是为什么我希望你能发布equals代码的原因。 - user2711811
1个回答

2
假设clusterManager最初为空,初始地理查询返回一个结果A。
进入parseJsonToList时,items中有一个条目(A),并且这一行:
itemss = clusterManagerAlgorithm.getItems();

返回一个空的Collection

由于itemss为空,因此

items.removeAll(itemss);

这段代码没有任何作用,接下来的代码会将A添加到地图中。

现在,15秒后同样的结果(A)被返回,这行代码

itemss = clusterManagerAlgorithm.getItems();

返回一个仅包含与 A 相等的项的集合(按位置(equals)),并且现在。
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,所以我无法推荐解决方案 - 如果您确实想这样做,那么可以完全摆脱“删除”逻辑。文档确实建议在添加后强制进行集群。

安迪,考虑到没有清晰的项目,这种情况下的解决方案是什么? - Brain Speller
在这种情况下,反转移除逻辑 - 从“itemss”中移除“items” - 但由于没有“removeAll”,因此您必须循环遍历“items”并使用“removeItem”。但是这又回到了您的“equals” - 如果它们曾经“移动”过,那么您将永远无法删除它们 - 只有在添加/删除时才适用您的逻辑,而这可能是正确的。 - user2711811

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接