【问题标题】:How to update marker positions with data from Firebase Google Maps API Android如何使用来自 Firebase Google Maps API Android 的数据更新标记位置
【发布时间】:2018-05-20 17:34:21
【问题描述】:

我正在创建一个使用 Firebase 数据库实时跟踪用户的应用。每个用户都使用标记显示在地图中。

当有新的位置更新时,必须更新标记。问题是,每次检索到新的位置更新时,使用 Firebase 方法 onDataChange() 或类似方法,我无法访问旧标记以将其删除并创建新标记或仅更新旧标记,因为标记没有不存在。

我尝试使用 Gson 在 SharedPreferences 中保存标记,但是当我将标记传递给 json 时,应用程序崩溃了。

有人知道如何更新标记吗?

这是写在onDataChange()里面的:

           for (User user: usersList) {
                Gson gson = new Gson();

                /*
                String previousJson = preferences.getString(user.getId()+"-marker", "");
                Marker previousMarker = gson.fromJson(previousJson, Marker.class);
                if (previousMarker!=null) markerAnterior.remove();
                */

                final LatLng latlng = new LatLng(user.getLastLocation().getLatitude(), user.getLastLocation().getLongitude());

                MarkerOptions markerOptions = new MarkerOptions()
                        .position(latlng)
                        .title(user.getId());

                Marker marker= mMap.addMarker(markerOptions);

             //   String newJson = gson.toJson(marker); //CRASH
            //    editor.putString(user.getId()+"-marker", newJson);
            //    editor.commit();

            }

谢谢。

【问题讨论】:

    标签: java android google-maps firebase marker


    【解决方案1】:

    创建一个将用户 ID 映射到标记的 HashMap 实例变量:

    private Map<String, Marker> mMarkerMap = new HashMap<>();
    

    然后,在 HashMap 中填充新的标记,以便以后检索它们。

    如果标记已经存在,只需更新位置:

    for (User user : usersList) {
    
        final LatLng latlng = new LatLng(user.getLastLocation().getLatitude(), user.getLastLocation().getLongitude());
    
        Marker previousMarker = mMarkerMap.get(user.getId());
        if (previousMarker != null) {
            //previous marker exists, update position:
            previousMarker.setPosition(latlng);
        } else {
            //No previous marker, create a new one:
            MarkerOptions markerOptions = new MarkerOptions()
                    .position(latlng)
                    .title(user.getId());
    
            Marker marker = mMap.addMarker(markerOptions);
    
            //put this new marker in the HashMap:
            mMarkerMap.put(user.getId(), marker);
        }
    }
    

    【讨论】:

    • 我将 HashMap 从 Firebase 的 onDataChange() 中取出,看来它有效!!但为什么? Firebase 调用是异步的,所以每个新位置的 mMarkerMap 都应该是 null,我错了吗?
    • @smartgg 是的,mMarkerMap 需要是类级别的实例变量,在任何方法之外定义。你能澄清一下为什么你不明白它为什么起作用吗? Firebase 调用只是为您提供当前的数据快照。您必须在应用程序中本地跟踪现有标记,这就是 HashMap 的作用。
    • 谢谢。我告诉过你,因为当我尝试从 Firebase 返回一些数据时,例如,如果我在 onDataChange 之外声明一个 ArrayList 并在 onDataChange 内部添加一些值,当我在外部调用 ArrayList 时,它没有保存任何值onDataChange.
    • @smartgg 如果您将 ArrayList 声明为类级实例变量,它应该包含添加到其中的所有数据,只要应用程序没有退出并重新启动。跨度>
    • @DanielNugent 你能看看我的问题吗?[链接] (stackoverflow.com/questions/47731956/…)。谢谢
    猜你喜欢
    • 2017-08-23
    • 2017-06-12
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2017-03-17
    • 2016-11-29
    • 1970-01-01
    • 2013-08-27
    相关资源
    最近更新 更多