如何使用来自 Firebase Google Maps API Android 的数据更新标记位置

Posted

技术标签:

【中文标题】如何使用来自 Firebase Google Maps API Android 的数据更新标记位置【英文标题】:How to update marker positions with data from 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();

            

谢谢。

【问题讨论】:

【参考方案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 你能看看我的问题吗?[链接] (***.com/questions/47731956/…)。谢谢

以上是关于如何使用来自 Firebase Google Maps API Android 的数据更新标记位置的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Firebase 数据库锁定给来自特定(电子邮件)域的任何用户?

使用 google firebase 和 spring 进行身份验证

如何将从 Google Place API 获取的信息存储到 Firebase?

Firebase 与 Android Java 中的 Google 云消息传递

我应该将 google-services.json(来自 Firebase)添加到我的存储库吗?

如何在flutter中将标记从firebase(真实数据库)检索到新的google maps api