【问题标题】:java.util.HashMap cannot be cast to com.google.android.gms.maps.model.LatLngjava.util.HashMap 无法转换为 com.google.android.gms.maps.model.LatLng
【发布时间】:2018-10-10 09:36:03
【问题描述】:

我想从 Firebase 数据库中获取 LatLng 列表。以前,我已通过此代码插入多边形列表,mMarkerPoints.add(new LatLng(latitude, longitude)); 和此databaseReference.child("Area").child(pushId).child("region").setValue(mMarkerPoints); 数据库结构为,

现在,我想从数据库中获取这个 mMarkerPoints。为此,我编写了代码List<LatLng> areaRegion = (ArrayList) dataSnapshot.child(key).child("region").getValue();,这段代码给了我例外。如何获得这份清单?

代码:

databaseReference.child("Area").addValueEventListener(new ValueEventListener() {
                                                        @Override
                                                        public void onDataChange(DataSnapshot dataSnapshot) {

                                                            for(DataSnapshot dataSnapshot1 :  dataSnapshot.getChildren()) {

                                                                String key = dataSnapshot1.child(dataSnapshot1.getKey()).getKey();
                                                                String areaName = dataSnapshot.child(key).child("name").getValue(String.class);
                                                                List<LatLng> areaRegion = (ArrayList<LatLng>) dataSnapshot.child(key).child("region").getValue();

                                                                for(int i = 0; i<values.size();i++) {
                                                                       Log.d("sdfljdjw", values.get(i));
                                                                  }

一点点解决方案: 我通过这段代码得到了这个结果{longitude=71.43064320087433, latitude=32.392359285468686}

Object value = dataSnapshot.child(key).child("region").getValue();
                                                                if(value instanceof List) {
                                                                    List<Object> sdfsd = (List<Object>) value;

                                                                    for(int i = 0; i<sdfsd.size();i++) {
                                                                        Log.d("sdfljdjw", sdfsd.get(i)+"");
                                                                    }
                                                                }
                                                                else {
                                                                    Log.d("sdfljdjw", "no");
                                                                }

现在如何将此值转换为 LatLng 对象?

10-10 14:20:30.539 11935-11935/com.example.salesman.salesmantrackingsystem E/AndroidRuntime:致命异常:主要 java.lang.ClassCastException:java.util.HashMap 无法转换为 com.google.android.gms.maps.model.LatLng 在 com.example.salesman.salesmantrackingsystem.LoginActivity$1$1$1$1.onDataChange(LoginActivity.java:154) 在 com.google.android.gms.internal.zzegf.zza(未知来源) 在 com.google.android.gms.internal.zzeia.zzbyc(未知来源) 在 com.google.android.gms.internal.zzeig.run(未知来源) 在 android.os.Handler.handleCallback(Handler.java:615) 在 android.os.Handler.dispatchMessage(Handler.java:92) 在 android.os.Looper.loop(Looper.java:153) 在 android.app.ActivityThread.main(ActivityThread.java:5086)

【问题讨论】:

  • 发布您的代码和异常日志
  • 请检查
  • 也发布那部分代码
  • 如果您仔细查看该结构,则它不是您尝试获取的数组列表,而是错误所述的哈希图。所以尝试以 hashmap 而不是 arraylist 的形式获取值
  • @VivekMishra 请告诉我该怎么做?

标签: android firebase firebase-realtime-database


【解决方案1】:

猜测(未经测试),替换:

List<LatLng> areaRegion = (ArrayList<LatLng>) dataSnapshot.child(key).child("region").getValue();

类似:

List<LatLng> areaRegion = new ArrayList<>();
List<Object> locations = (List<Object>) dataSnapshot.child(key).child("region").getValue();
for (Object locationObj : locations) {
  Map<String, Object> location = (Map<String, Object>) locationObj;
  LatLng latLng = new LatLng((Double) location.get("latitude")), (Double) location.get("longitude"));
  areaRegion.add(latLng);
}

【讨论】:

  • java.lang.ClassCastException: java.util.ArrayList 无法转换为 java.util.Map
  • 这一行出错 Map locations = (Map) dataSnapshot.child(key).child("region").getValue();
  • @zohaib:更新为转换为列表。
  • 没问题,这是一个反复试验的过程。如果您需要有关从DataSnapshot 提取数据的更多信息,请查看here
【解决方案2】:

试试这样的

  Map<String, Object> td = (HashMap<String,Object>) dataSnapshot.getValue();

    List<Object> values = td.values();

【讨论】:

  • java.lang.ClassCastException: java.util.HashMap$Values 不能转换为 java.util.List
  • 这应该可以,可能是你遗漏了一些东西,只是尝试调试并查看你在第一行得到的 hasmap 值,即 map。如果它在那里没有给出异常并且如果这些是您想要访问的正确值,那么在该映射之后映射到列表对象
  • 最好只转换为 Map&lt;String, Object&gt; 而不是猜测具体类型。
  • 首先看看你是否获取了 map 中的值,这应该发生,如果没有发生,而不是你说你无法访问 map 中的值或其他情况,而是只是不工作。这将有助于解决您的问题,请始终提供更多信息。
  • 通过这段代码,我得到了类似的价值。 {longitude=71.43064320087433, latitude=32.392359285468686} 代码:对象值 = dataSnapshot.child(key).child("region").getValue(); if(value instanceof List) { List sdfsd = (List) value; for(int i = 0; i
猜你喜欢
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多