You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

mMap.setOnMarkerClickListener点击传值方法 标记返回相同CamperSiteID如何解决

问题根因
  • 你在onChildAdded回调中反复调用mMap.setOnMarkerClickListener设置监听器,后设置的监听器会直接覆盖之前的所有设置,最终所有Marker点击触发的都是最后一次添加的监听器,因此只会弹出最后一个营地的CamperSiteID
  • 没有对Marker和对应营地ID做绑定,监听器中直接引用的外部CampSitePostID变量会随着数据遍历不断被覆盖,最终值固定为最后一个营地的ID
  • 额外问题:你Firebase数据结构里的国家字段为拼写错误的Counrty,但查询时用的是country,会导致查询不到符合条件的数据,需要同步修正
解决方案
  1. 将setOnMarkerClickListener的设置逻辑移动到地图初始化的位置,不要放在数据遍历回调中重复设置
  2. 每次添加Marker时,将对应的CamperSiteID设置为该Marker的Tag,点击事件触发时直接从当前被点击的Marker对象中取出Tag即可获取对应ID
  3. 删除无用的list.clear()调用和冗余for循环:onChildAdded每次仅返回单条营地数据,你写的for循环每次仅会执行1次完全没有意义,且list.clear()放在此处会导致每次新增营地数据时清空列表,后续用到list时数据会缺失
修正后代码示例
// 1. 在地图初始化完成后就设置一次点击监听器即可
mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
        // 直接从当前点击的Marker中取出存储的CamperSiteID
        String campSitePostID = (String) marker.getTag();
        Toast.makeText(getContext(), campSitePostID, Toast.LENGTH_SHORT).show();
        return false;
    }
});

// 2. Firebase数据读取逻辑修改
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Campsite");
// 注意修正字段拼写,和你数据库里的Counrty保持一致,或者把数据库字段改成正确的country
Query query = reference.orderByChild("Counrty").equalTo(country);
query.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String previousChildName) {
        List<String> mapImage = (List<String>) dataSnapshot.child("CamperSiteImages").getValue();
        Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();
        Double lat = (Double)map.get("CamperSiteLatitude");
        Double lng = (Double)map.get("CamperSiteLongitude");
        LatLng newLocation = new LatLng(lat, lng);
        String campSiteName = (String) map.get("CamperSiteName");
        String campSitePostID = (String) map.get("CamperSiteID");
        String campSiteType= (String) map.get("type");
        String campSiteImage = mapImage.get(0);
        list.add(String.valueOf(newLocation));
        
        try{
            //bitmap = Ion.with(getApplicationContext()).load(campSiteImage).withBitmap().fitCenter().resize(120,120).asBitmap().get();
        } catch (Exception e){
            e.printStackTrace();
        }
        // 添加Marker时将营地ID设为Tag
        Marker marker = mMap.addMarker(new MarkerOptions()
                .position(newLocation)
                .title(campSiteName)
                .icon(BitmapDescriptorFactory.fromResource(icon)));
        marker.setTag(campSitePostID);
        
        progressDialog.dismiss();
    }
    // 其余ChildEventListener的回调方法自行补充实现
});

内容的提问来源于stack exchange,提问作者user16489264

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:45:00