首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用数据凝固法从地图标记中提取数据

利用数据凝固法从地图标记中提取数据
EN

Stack Overflow用户
提问于 2019-11-16 12:17:53
回答 2查看 329关注 0票数 2

我有个数据库:

代码语言:javascript
复制
{
  "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:

代码语言:javascript
复制
override fun onMarkerClick(marker: Marker): Boolean {
        mRefLocal.addValueEventListener(vael)
        return false
    }

这是我的addValueEventListener

代码语言:javascript
复制
  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获得相同的数据。我想从点击的标记中得到分配的数据。怎么了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-17 09:45:09

使用以下代码时:

代码语言:javascript
复制
override fun onMarkerClick(marker: Marker): Boolean {
    mRefLocal.addValueEventListener(vael)
    return false
}

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

代码语言:javascript
复制
mRefLocal.child(marker.title).addValueEventListener(vael)

看,我给.child(marker.name)添加了一个电话。由于您没有name属性,所以应该在每个对象下添加它。您的模式应该如下所示:

代码语言:javascript
复制
{
  "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获得相同的数据。

让我猜猜,总是最后一次,对吧?请注意,这是预期的行为,因为您正在遍历所有对象,并且只在最后一个对象中添加。因此,您只分配给titleiddesc变量,这些变量的值仅来自上一次迭代。

我想从点击的标记中获得分配的数据。

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

代码语言:javascript
复制
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对象上添加。

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

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

票数 1
EN

Stack Overflow用户

发布于 2019-11-16 13:25:53

从onMapReady中的firebase加载标记。

代码语言:javascript
复制
override fun onMapReady(googleMap: GoogleMap) {
    mMap = googleMap
    mRefLocal.addValueEventListener(vael)
}

创建标记时,设置feed对象

代码语言:javascript
复制
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

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58890640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档