我有个数据库:
{
"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-map。当我点击标记时,它会打开新的细节活动。因此,我希望这个标记将数据从标记传递到详细的活动中。
我使用onMarkerClick:
override fun onMarkerClick(marker: Marker): Boolean {
mRefLocal.addValueEventListener(vael)
return false
}这是我的addValueEventListener
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) {}
}因此,无论我单击哪个标记,我总是从db获得相同的数据。我想从点击的标记中得到分配的数据。怎么了?
发布于 2019-11-17 09:45:09
使用以下代码时:
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属性了吗?
因此,无论我单击什么标记,我总是从db获得相同的数据。
让我猜猜,总是最后一次,对吧?请注意,这是预期的行为,因为您正在遍历所有对象,并且只在最后一个对象中添加。因此,您只分配给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对象上添加。
,所以我希望这个标记将数据从标记传递到详细的活动中。
使用此解决方案,您只传递被单击的标记的详细信息。
发布于 2019-11-16 13:25:53
从onMapReady中的firebase加载标记。
override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap
mRefLocal.addValueEventListener(vael)
}创建标记时,设置feed对象
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
}https://stackoverflow.com/questions/58890640
复制相似问题