首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Marker.remove(),Marker.setPosition不工作

Marker.remove(),Marker.setPosition不工作
EN

Stack Overflow用户
提问于 2018-06-15 15:18:38
回答 1查看 553关注 0票数 0

嗨,所以我正在使用Geofire,每当我的查询范围内有一个对象时,我试图在用户地图上显示它,使用标记并实时更新标记位置。

我在geofire of输入方法中初始化了标记,然后当键的位置发生变化(因此调用onkeymoved )时,我使用marker.setposition更改标记的位置。但是,标记在原来的位置创建它的副本,然后移动(创建2个标记,即使我只使用setPosition)。

以下是geofire侦听器的代码:

代码语言:javascript
复制
geoQueryP.addGeoQueryEventListener(new GeoQueryEventListener() {
                        @Override
                        public void onKeyEntered(String key, GeoLocation location) {
                            LatLng drivLoc = new LatLng(location.latitude, location.longitude);
                            createDriverMarker(key, drivLoc, reference);
                        }
                        @Override
                        public void onKeyExited(String key) {
                            if(markerPoints.get(key) != null) {
                                markerPoints.get(key).remove();
                                markerPoints.remove(key);
                            }
                        }
                        @Override
                        public void onKeyMoved(String key, GeoLocation location) {
                            if(markerPoints.get(key) != null) {
                                markerPoints.get(key).setPosition(new LatLng(location.latitude, location.longitude));
                            }
                        }
                        @Override
                        public void onGeoQueryReady() {
                        }
                        @Override
                        public void onGeoQueryError(DatabaseError error) {
                            Toast.makeText(getApplicationContext(), error + " Please Try Again", Toast.LENGTH_LONG).show();
                        }
                    });

下面是createDriverMarker方法的代码:

代码语言:javascript
复制
private void createDriverMarker(String key, LatLng drivLocation, String reference) {
    MarkerOptions markerOptions = new MarkerOptions();
    locationRelatedFunctions bitmap = new locationRelatedFunctions();
    markerOptions.position(drivLocation)
            .title(reference)
            .icon((bitmap.bitmapDescriptorFromVector(getApplicationContext(), R.drawable.ic_radio_button_checked_black_24dp)));
    Marker marker = mMap.addMarker(markerOptions);
    markerPoints.put(key, marker);
}

MarkerPoints是一个hashmap,初始化如下:

代码语言:javascript
复制
    public HashMap<String, Marker> markerPoints;

然后在onCreate中:

代码语言:javascript
复制
        markerPoints = new HashMap<String, Marker>();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-15 16:50:49

怀疑onKeyEntered的调用比预期的要多,但可以补救:

代码语言:javascript
复制
public void onKeyEntered(String key, GeoLocation location) {
    LatLng drivLoc = new LatLng(location.latitude, location.longitude);
    if (!markerPoints.containsKey(key)) {
        createDriverMarker(key, drivLoc, reference);
    } else {
       // this part is optional given that the 'moved' event may have
       // triggered first...
       onKeyMoved(key,location);
    }
}

您可能需要添加调试以确认额外的onKeyEntered调用。

OP代码中的一个缺陷是大致相同的--如果对同一个键调用两次onKeyEntered,您将得到两个标记--一个是自第二个相同键的“put”覆盖第一个键而将原始标记留在地图上以来的非托管标记。原则上,您的代码应该可以工作,但是您仍然应该防止意外事件的发生。

更完整的分析将要求您发布如何使用位置更新更新GeoFire。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50878468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档