如何从 Map<String, List<String>> 获取数组值并放入 setOnMarkerClickListener?

Posted

技术标签:

【中文标题】如何从 Map<String, List<String>> 获取数组值并放入 setOnMarkerClickListener?【英文标题】:How can I get array value from Map<String, List<String>> and put into setOnMarkerClickListener? 【发布时间】:2021-11-13 23:44:54 【问题描述】:

如何从 Map 获取数组值并放入 setOnMarkerClickListener?

我可以获取 LatLng 值并放入谷歌地图标记,然后用户单击标记可以显示标题。但我想将标记替换为自定义图像。如何从图像数组中获取值?因为图片是必须上传的,所以我只想得到值[0]。

当用户单击我想要获取 PostID 的标记时,如何将 PostID 发送到 onMarkerClick?

这是 Firebase 数据

"Campsite" : 
    "-MfS3VgBGROs_afkVrjl" : 
      "CamperSiteAddress" : "Charles St & Esplanade W, Triabunna TAS 7190, Australia",
      "CamperSiteID" : "-MfS3VgBGROs_afkVrjl",
      "Counrty" : "Australia",
      "CamperSiteImages" : [
 "https://firebasestorage.googleapis.com/v0/b/campingau-6b84d.appspot.com/o/CampSitePhotos%2F1627206575487.null?alt=media&token=bff07bd4-fd17-4099-a0d7-db0418311425", 
"https://firebasestorage.googleapis.com/v0/b/campingau-6b84d.appspot.com/o/CampSitePhotos%2F1627206580478.null?alt=media&token=995bf983-0ee8-4f25-af3f-921aa5b0077c", 
"https://firebasestorage.googleapis.com/v0/b/campingau-6b84d.appspot.com/o/CampSitePhotos%2F1627206584072.null?alt=media&token=137b87a9-f6fb-4f75-9d53-7c3efda8cda4" 
],
      "CamperSiteLatitude" : -42.508695,
      "CamperSiteLongitude" : 147.916617,
      "CamperSiteName" : "Encampment Cove Walk"
    

这是我的代码

DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Campsite");

Query query = reference.orderByChild("country").equalTo(country);
query.addChildEventListener(new ChildEventListener() 
    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String previousChildName) 
        list.clear();
        Map<String, List<String>> mapImage = (Map<String, List<String>>) dataSnapshot.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.valueOf(map.get("CamperSiteName"));
        String CampSitePostID = (String) map.get("CamperSiteID");
        //String CampSiteImage = mapImage.get("CamperSiteImages");
        list.add(String.valueOf(newLocation));
        //listImage.add(CampSiteImage);
        for(int i = 0; i < list.size(); i++)
            Bitmap bitmap = null;
            try
                byte[] imageAsBytes = Base64.decode(listImage.get(i).getBytes(), Base64.DEFAULT);
                bitmap = BitmapFactory.decodeByteArray(imageAsBytes,0,imageAsBytes.length);
             catch (Exception e)
                e.printStackTrace();
            
            progressDialog.dismiss();
            //mMap.addMarker(new MarkerOptions().position(newLocation).title(listTitle.get(i)).icon(BitmapDescriptorFactory.fromBitmap(bitmap)));
            mMap.addMarker(new MarkerOptions().position(newLocation).title(CampSiteName).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
            mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() 
                @Override
                public boolean onMarkerClick(Marker marker) 
                    Toast.makeText(getContext(),CampSitePostID, Toast.LENGTH_SHORT).show();
                    return false;
                
            );
        
    

【问题讨论】:

请编辑您的问题并将您的数据库结构添加为 JSON 文件,而不是描述您的数据库的外观。您可以通过单击 Firebase Console 的溢出菜单 (⠇) 中的导出 JSON 来简单地获取它。 @AlexMamo 好的,我改变了我的上下文。 那么你需要获取CamperSiteImages里面的数据吗? @AlexMamo 我有两个问题,首先,我需要获取 CamperSiteImages 值,因为我想替换标记。其次,当我单击 onMarkerClick 时,我需要获取 CamperSiteID,然后我将更改为其他片段,但是现在当我单击标记时,我总是得到相同的 CamperSiteID 我在“-MfS3VgBGROs_afkVrjl”节点中看不到任何“国家”字段。 【参考方案1】:

这似乎是错误的:

Map<String, List<String>> mapImage = (Map<String, List<String>>) dataSnapshot.getValue();

图像列表存储在快照的CamperSiteImages 属性中,因此您需要:

List<String> mapImage = (List<String>) dataSnapshot.child("CamperSiteImages").getValue();

【讨论】:

thx,还有其他问题,我使用setOnMarkerClickListener时如何获取CamperSiteID 我可以压缩位图吗?这是我的方法。 bitmap = Ion.with(getApplicationContext()).load(CampSiteImage).withBitmap().fitCenter().resize(100,100).asBitmap().get();

以上是关于如何从 Map<String, List<String>> 获取数组值并放入 setOnMarkerClickListener?的主要内容,如果未能解决你的问题,请参考以下文章

如何将两个List<Map<String,Object>>合并为一个

如何把list<map> 变成list<string>

如何将map<string list<>>转换成城map<string,object>

list<String>如何转化为Map<String, Object>,list<EmpVO>如何转化为Map<String, Object>

从 Map<String,List<String>> 获取密钥,知道列表值之一

Stream的去重