Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在群集管理器中删除旧地图标记并加载新地图标记_Android_Google Maps_Google Maps Markers_Cluster Computing_Markerclusterer - Fatal编程技术网

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

Android 在群集管理器中删除旧地图标记并加载新地图标记,android,google-maps,google-maps-markers,cluster-computing,markerclusterer,Android,Google Maps,Google Maps Markers,Cluster Computing,Markerclusterer,我有一个google地图,我正在尝试使用geoQuery每隔15秒刷新firebase中的标记,这意味着我将删除所有以前的标记,并使用以下方法添加新标记: private void downloadExtraPrinters(LatLng viewCenter, int viewRadius) { try { final GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(viewCenter.lat

我有一个google地图,我正在尝试使用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){

    }


}
ParseJsonList方法:

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秒,直到下一次调用parsejsontolost方法时,所有标记都会在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秒。我为这个问题挣扎了两周,请帮助

假设clusterManager最初为空,并且初始geoquery返回单个结果a

在进入
parseJsonToList
时,
中有一个条目(A),此行:

itemss = clusterManagerAlgorithm.getItems();
mClusterManager.addItems(items);
返回一个空的
集合

既然
items
是空的

items.removeAll(itemss);
没有效果,代码的其余部分将向映射中添加一个

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

itemss = clusterManagerAlgorithm.getItems();
返回一个集合,其中一个项相当于(按位置(等于)),现在

将删除当前结果(A),因为它也位于
itemss
(同样通过
equals
使用位置)

因此,当您在此行中添加
项时:

itemss = clusterManagerAlgorithm.getItems();
mClusterManager.addItems(items);
未添加任何内容,因为
为空

所以这种模式很有可能

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

我不能推荐一个解决方案,因为我不明白为什么最后会出现
clearItems
——如果你真的想这样做,那就完全去掉“remove”逻辑。文档确实建议在添加后强制集群。

发布
equals的MyItem实现,或者注意它是否未被覆盖。我已经覆盖了equals,还覆盖了MyItem.class中的hashCode——AndyRight——因此,如果您正在做类似于比较equals中的lat/lngs的事情,那么问题是删除一个过程所有的东西,然后15秒后,它们被添加回来,这就是为什么我希望你可以发布平等的代码。考虑到不存在Currar条目,这个案例的解决方案是什么?在这种情况下,反转移除逻辑-从<代码> ITEMSS中删除<代码>项目< /代码> -但是因为没有“ReaveWALL”。您必须循环查看
删除项
。但这又回到了你的
等于
——如果它们曾经“移动”,那么你永远不会删除它们——你的逻辑只适用于它们被添加/删除的情况,可能就是这样。