簡體   English   中英

java.util.HashMap 不能投(android studio, firebase,java)

[英]java.util.HashMap cannot be cast (android studio, firebase,java)

我的 firebase-realtime-database 映像

我在上一個部分(Java 和 Firebase)上被困了兩天。

我在數據庫中保留了一個類類型列表,但是當我嘗試將其設置為 Firebase 時出現錯誤。

這是代碼:

ArrayList<PostDetails_class> cPostList=new ArrayList<PostDetails_class>();
FirebaseDatabase.getInstance().getReference().addValueEventListener( new ValueEventListener() {
          @Override
          public void onDataChange(@NonNull DataSnapshot snapshot) {
              cPostList= (ArrayList<PostDetails_class>) snapshot.child( "application_details" ).child( "community_postsList" ).getValue();
          }
          @Override
          public void onCancelled(@NonNull DatabaseError error) {

          }
      } );

這是從“cPost_List”列表中讀取數據的嘗試,該列表是從“PostDetails_class”class 構建的列表。 (“community_postsList”是“PostDetails_class”類的子列表):

PostDetails_class postDetails_class=cPostList.get( 0 );  //line 123 in main activity

錯誤:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapp, PID: 1938
    java.lang.ClassCastException: java.util.HashMap cannot be cast to com.example.myapp.PostDetails_class
        at com.example.myapp.MainActivity.makeList(MainActivity.java:123)

當您在不傳遞任何參數的情況下調用getValue()時,Firebase 返回數據的本機類型,在本例中為Map<String, Object>

你需要告訴 Firebase 什么 class 通過在getValue的調用中指定它返回,例如: getValue(PostDetails_class.class)


Firebase 無法按照您要求的方式返回通用列表,因為返回了列表的類型。 我通常更喜歡循環子節點,並一一提取它們:

ArrayList<PostDetails_class> cPostList=new ArrayList<PostDetails_class>();
FirebaseDatabase.getInstance().getReference("application_details/community_postsList").addValueEventListener( new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        for (DataSnapshot child: snapshot.getChildren()) {
            PostDetails_class value = child.getValue(PostDetails_class.class);
            cPostList.add(value);
        }
    }
    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        throw error.toException();
    }
});

您會注意到我還更改了代碼以從更深的節點加載數據,而不是加載整個數據庫。


如果您想在一個 go 中獲取整個列表,這是可能的,但您需要列表的通用類型指示器。 我建議在有關 [ firebase-realtime-database][android] generictypeindicator的這些問題中閱讀更多內容。

ArrayList<PostDetails_class> cPostList=new ArrayList<PostDetails_class>();

Firebase 返回HashMap ,因此您無法將其接收到ArrayList

所以你需要將cPostList的類型更改為HashMap<Integer, PostDetails_class>

HashMap<Integer, PostDetails_class> cPostList = new HashMap<>();

FirebaseDatabase.getInstance().getReference().addValueEventListener( new ValueEventListener() {
          @Override
          public void onDataChange(@NonNull DataSnapshot snapshot) {
              cPostList= (HashMap<Integer, PostDetails_class>) snapshot.child( "application_details" ).child( "community_postsList" ).getValue();
          }
          @Override
          public void onCancelled(@NonNull DatabaseError error) {

          }
      } );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM