我正在努力使用onDataChange
访问从数据库返回的信息。我知道这是由于它的异步特性,但是我需要将这些值存储在某个地方,以便在代码完成后进行访问。
我在Firebase数据库中存储了一个user
子级,该子级存储了lat
和lng
位置。然后,我的代码按如下方式检索它:
override fun onDataChange(dataSnapshot: DataSnapshot) {
var user: User?
dataSnapshot.children.forEach {
user = it.getValue(User::class.java)
Log.d("Maps::user::lat", user?.lat.toString()) // Has info
Log.d("Maps::user::lng", user?.lng.toString()) // Has info
mMyLocation.latitude = user!!.lat!!
mMyLocation.longitude = user!!.lng!!
}
}
val location = LatLng(mMyLocation.latitude, mMyLocation.longitude) // 0.0 and 0.0
该应用程序不仅拥有我的位置,而且还包含地图上的其他标记。如果我将所有代码移动以显示我的位置到方法内部,则不会显示在onMapReady
中设置的其他标记。我需要有关如何实现的建议。
答案 0 :(得分:1)
首先只需声明一个gloabl(类)标记引用
lateint var myLocMarker:Marker
然后将您的位置标记添加到Google地图(onmapready等)
var a = MarkerOptions()
.position(LatLng(50,6))) // any position, which you already have, i suppose
myLocMarker = map.addMarker(a)
然后在onDataChange
内将标记位置更新为
override fun onDataChange(dataSnapshot: DataSnapshot) {
var user: User?
dataSnapshot.children.forEach {
user = it.getValue(User::class.java)
Log.d("Maps::user::lat", user?.lat.toString()) // Has info
Log.d("Maps::user::lng", user?.lng.toString()) // Has info
mMyLocation.latitude = user!!.lat!!
mMyLocation.longitude = user!!.lng!!
myLocMarker.setPosition(LatLong(user!!.lat!!,user!!.lng!!))
}
}