我有这个数据库:
{
"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
添加最后一个对象。因此,您可以为title
、id
和desc
变量指定仅来自上次迭代的值。
我想从单击的标记中获取分配的数据。
要只获取特定元素的数据,请使用以下代码:
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
}