2017-09-30 53 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

我已将地图添加到我的匹配类,现在我仍然得到相同的错误,除非我认为并且不知道该怎么做,那么必须对类/重新构造的其余部分进行修改? –

相关问题