使用数据快照从地图标记中获取数据



我有这个数据库:

{
"Locale" : {
"Feed1" : {
"title" : "title1"
"desc" : "description"
"lat" : 47.56494,
"lng" : 46.245,
},
"Feed2" : {
"desc" : "Desc nomer 2",
"id" : "id 2",
"lat" : 45.56494,
"lng" : 47.245,
"title" : "title2"
}
},
}

我在我的活动中添加了带有标记的g图。当我点击标记时,它将打开新的详细活动。所以我希望这个标记将数据从标记传递到细节活动中。

我使用onMarkerClick:

override fun onMarkerClick(marker: Marker): Boolean {
mRefLocal.addValueEventListener(vael)
return false
}

这是我的addValueEventListener(vael(

var vael: ValueEventListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
for (snapshot in dataSnapshot.children) {
val feeds = snapshot.getValue(Feeds::class.java)
title = feeds!!.title
id = feeds.id
desc = feeds.desc
}
val intent = Intent(this@MapsActivity, FeedsDetail::class.java)
intent.putExtra("id", id)
intent.putExtra("desc", desc)
intent.putExtra("title", title)
startActivity(intent)
Toast.makeText(this@MapsActivity, title, Toast.LENGTH_SHORT).show()
}
override fun onCancelled(databaseError: DatabaseError) {}
}

所以,无论我点击哪个标记,我总是从数据库中获得相同的数据。我想从单击的标记中获取指定的数据。怎么了?

当您使用以下代码时:

override fun onMarkerClick(marker: Marker): Boolean {
mRefLocal.addValueEventListener(vael)
return false
}

您正在mRefLocal节点上添加一个侦听器,该侦听器指向Locale节点,而不是特定的FeedsDetail对象。Locale节点包含所有FeedsDetail对象。因此,您应该使用:

mRefLocal.child(marker.title).addValueEventListener(vael)

看,我已向.child(marker.name)添加了一个呼叫。由于您没有name属性,因此应该将其添加到每个对象下。你的模式应该是这样的:

{
"Locale" : {
"Feed1" : {
"name" : "Feed1", //Added
"title" : "title1",
"desc" : "description1",
"id" : "id 1",
"lat" : 47.56494,
"lng" : 46.245
},
"Feed2" : {
"name" : "Feed2", //Added
"title" : "title2",
"desc" : "Desc nomer 2",
"id" : "id 2",
"lat" : 45.56494,
"lng" : 47.245
}
},
}

请参阅,每个对象下的新name属性?

所以无论我点击哪个标记,我都会从数据库中获得相同的数据。

让我猜猜,它总是最后一个,对吧?请注意,这是预期的行为,因为您正在循环所有对象,并且只向Intent添加最后一个对象。因此,您可以为titleiddesc变量指定仅来自上次迭代的值。

我想从单击的标记中获取分配的数据。

要只获取特定元素的数据,请使用以下代码:

var vael: ValueEventListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
val feeds = dataSnapshot.getValue(Feeds::class.java)
val intent = Intent(this@MapsActivity, FeedsDetail::class.java)
intent.putExtra("id", feeds.id)
intent.putExtra("desc", feeds.desc)
intent.putExtra("title", feeds!!.title)
startActivity(intent)
Toast.makeText(this@MapsActivity, title, Toast.LENGTH_SHORT).show()
}
override fun onCancelled(databaseError: DatabaseError) {}
}

请参阅,现在不需要任何循环,因为侦听器仅添加在特定的FeedsDetail对象上。

所以我希望这个标记将数据从标记传递到细节活动中。

使用此解决方案,您只传递单击的标记的详细信息。

在onMapReady中从firebase加载标记。

override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap
mRefLocal.addValueEventListener(vael)
}

当你创建你的标记设置你的饲料对象

var vael: ValueEventListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
for (snapshot in dataSnapshot.children) {
val feeds = snapshot.getValue(Feeds::class.java)
val marker = mMap.addMarker(MarkerOptions())
marker.tag = feeds
}
}
override fun onCancelled(databaseError: DatabaseError) {}
}

在您的活动中打开-onClickMarker

override fun onMarkerClick(marker: Marker): Boolean {
val feed = marker.tag as Feed
val intent = Intent(this@MapsActivity, FeedsDetail::class.java)
intent.putExtra("id", feed.id)
intent.putExtra("desc", feed.desc)
intent.putExtra("title", feed.title)
startActivity(intent)
Toast.makeText(this@MapsActivity, title, Toast.LENGTH_SHORT).show()
return false
}

相关内容

  • 没有找到相关文章