2017-09-30 87 views
1

力圖打造FirebaseRecyclerAdapter該檢索數據從對象類中的所有數據,但我得到的錯誤「無法java.util.HashMap的類型的值轉換爲字符串」 這裏是我的代碼:FirebaseRecyclerAdapter但無法將類型java.util.HashMap的值轉換爲String?

public class Match { 


    private Map<String, Object> name; 
    private Map<String, Object> desc; 

    public Map<String, Object> getName() { 
     return name; 
    } 

    public Map<String, Object> getDesc() { 
     return desc; 
    } 

    public Match(){} //even with /without this guy 
} 


public class MatchHolder extends RecyclerView.ViewHolder { 
    private final TextView mNameField; 
    private final TextView mMessageField; 

    public MatchHolder(View itemView) { 
     super(itemView); 
     mNameField = (TextView) itemView.findViewById(android.R.id.text1); 
     mMessageField = (TextView) itemView.findViewById(android.R.id.text2); 
    } 

    public void setName(Map<String, Object> name) { 
     mNameField.setText((CharSequence) name); 
    } 

    public void setDesc(Map<String, Object> desc) { 
     mMessageField.setText((CharSequence) desc); 
    } 
} 



public class SportActivity extends AppCompatActivity { 

    final FirebaseDatabase database = FirebaseDatabase.getInstance(); 



    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_sport); 

DatabaseReference ref = database.getReference("myApp/sportActivity"); //with this guy i get the mentioned error 

     //if use   DatabaseReference ref = database.getReference("myApp/sportActivity/Match"); 
     //i get in the log cat ,error W/ClassMapper: No setter/field for name1,name2 ,desc1,desc2 ...etc  
     RecyclerView matches = (RecyclerView) findViewById(recycle_viewer); 
     matches.setHasFixedSize(true); 
     matches.setLayoutManager(new LinearLayoutManager(this)); 


     FirebaseRecyclerAdapter<Match, MatchHolder> mAdapter = new FirebaseRecyclerAdapter<Match, MatchHolder>(
       Match.class, 
       android.R.layout.two_line_list_item, 
       MatchHolder.class, 
       ref) { 
      @Override 
      public void populateViewHolder(MatchHolder holder, Match match, int position) { 
       holder.setName(match.getName()); 
       holder.setDesc(match.getDesc()); 
      } 
     }; 

     matches.setAdapter(mAdapter); 



    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     FirebaseRecyclerAdapter mAdapter = null; 
     mAdapter.cleanup(); 
    } 


    } 

我可以不能上傳我的數據庫的PIC,但是,結構是: 對myApp/sportActivity/ 這裏是sportActivity的JSON:

"sportActivity" : { 
     "Match" : { 
     "desc" : { 
      "des3" : "desc3", 
      "desc2" : "desc2" 
     }, 
     "name" : { 
      "name1" : "name1", 
      "name2" : "name2" 
     } 
     } 
    } 
    } 
} 
+0

不要嘗試上傳圖片,請編輯您的問題以包含數據庫的實際最小JSON。您可以通過點擊[Firebase數據庫控制檯](https://console.firebase.google.com/project/_/database/data)中的「導出JSON」鏈接來獲取此信息。 –

+0

你能展示更多代碼嗎? – KeLiuyue

+0

@KeLiuyue提供了所有必需的代碼。 –

回答

1

Match對象具有以下結構:

{ 
    "desc" : { 
    "des3" : "desc3", 
    "desc2" : "desc2" 
    }, 
    "name" : { 
    "name1" : "name1", 
    "name2" : "name2" 
    } 
} 

你使用以讀取該數據到Java類是:

public class Match { 
    private String name; 
    private String desc; 

    public Match() { } 

    public String getName() { return name; } 
    String getDesc() { return desc; } 
} 

這些不匹配:你的Java類說desc是一個字符串,但它實際上是一個嵌套的JSON對象。由於該嵌套JSON對象沒有類,因此Firebase將其讀取爲Map<String, Object。由於您的desc屬性是一個字符串,它是一個不兼容的類型,並導致類拋出異常。

要了解更多有關如何嵌套的對象模型,看看我的答案在這裏:Creating Nested Object Firebase structure

更新:適用於您的JSON,最小的Java類似乎是:

public class Match { 
    private Map<String, Object> name; 
    private Map<String, Object> desc; 

    public Map<String, Object> getName() { 
     return name; 
    } 

    public Map<String, Object> getDesc() { 
     return desc; 
    } 
} 
+0

說已經將這樣的地圖添加到Match類,對其他類應該發生什麼樣的修改? –

+0

我鏈接的答案包含了你需要做的一個完整的最簡單的例子。編輯你的問題,以顯示你做了什麼,我會看看。 –

+0

我已將地圖添加到我的匹配類,現在我仍然得到相同的錯誤,除非我認爲並且不知道該怎麼做,那麼必須對類/重新構造的其餘部分進行修改? –

相關問題