java.lang.ClassCastException:java.util.HashMap不能转换为java.lang.String
嘿,有人能帮我清除这个错误吗: java.lang.ClassCastException:java.util.HashMap不能转换为java.lang.String 在in.xyz.firebase.main活动中$1.onDataChange MainActivity.javajava.lang.ClassCastException:java.util.HashMap不能转换为java.lang.String,java,android,firebase,Java,Android,Firebase,嘿,有人能帮我清除这个错误吗: java.lang.ClassCastException:java.util.HashMap不能转换为java.lang.String 在in.xyz.firebase.main活动中$1.onDataChange MainActivity.java import java.lang.String; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import
import java.lang.String;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TextView;
import com.firebase.client.DataSnapshot;
import com.firebase.client.Firebase;
import com.firebase.client.FirebaseError;
import com.firebase.client.ValueEventListener;
public class MainActivity extends AppCompatActivity {
private Firebase mRef;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Firebase.setAndroidContext(this);
}
@Override
protected void onStart() {
super.onStart();
Button b1 = (Button) findViewById(R.id.buttonSunny);
Button b2 = (Button) findViewById(R.id.buttonFoggy);
final TextView t1 = (TextView) findViewById(R.id.textView);
mRef = new Firebase("https://docs- examples.firebaseio.com/web/saving-data/fireblog/posts");
mRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String value = (String) dataSnapshot.getValue();
t1.setText(value);
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}
}
有人知道如何解决这个问题吗?我猜您正在使用API,而getValue()方法正在返回Hashmap
你应该喜欢这个-
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
HashMap<String, Object> yourData = dataSnapshot.getValue();
// now get the data from the hashmap and set it to the text view
}
@覆盖
公共void onDataChange(DataSnapshot DataSnapshot){
HashMap yourData=dataSnapshot.getValue();
//现在从hashmap获取数据并将其设置为文本视图
}
正如文档中所给出的,getValue也可以返回不同的类型,因此您必须相应地处理它 始终使用POJO而不是HashMap:)
伟大的回答@Rahul Chaurasia!但我只是想扩展一下
假设您有一个类Todo
:
public class Todo {
private String author;
private String message;
public Todo() {
// empty default constructor, necessary for Firebase to be able to deserialize blog posts
}
public String getAuthor() {
return author;
}
public String getMessage() {
return message;
}
}
因为这个类有一个空构造函数,所以它有资格使用Firebase进行反序列化
// Text view
final TextView t1 = (TextView) findViewById(R.id.textView);
// Get a reference to our posts
Firebase ref = new Firebase("<my-firebase-db>/todos/1");
// Get the todos
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
Todo todo = snapshot.getValue(Todo.class);
t1.setText(todo.getMessage());
}
@Override
public void onCancelled(FirebaseError firebaseError) {
System.out.println("The read failed: " + firebaseError.getMessage());
}
});
//文本视图
最终TextView t1=(TextView)findViewById(R.id.TextView);
//获取对我们帖子的引用
Firebase ref=新Firebase(“/todos/1”);
//记下待办事项
ref.addValueEventListener(新的ValueEventListener(){
@凌驾
公共无效onDataChange(数据快照快照){
Todo Todo=snapshot.getValue(Todo.class);
t1.setText(todo.getMessage());
}
@凌驾
取消后的公共无效(FirebaseError FirebaseError){
System.out.println(“读取失败:+firebaseError.getMessage());
}
});
使用类而不是
HashMap
可以提供更好的类型安全性。而且,它还利用了Firebase SDK内置的功能。看起来getValue()
正在返回一个HashMap。看看文档:这不起作用。即使在类型转换之后,我仍然得到另一个HashMap而不是Object。