Android 无法将java.lang.String转换为java.util.HashMap错误

Android 无法将java.lang.String转换为java.util.HashMap错误,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我有以下代码试图检索firebase值。我的数据库结构如下: 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity\u mystatement); listview=(listview)findViewById(R.id.listview); adapter=new ArrayAdapter(这是android.R.layout.s

我有以下代码试图检索firebase值。我的数据库结构如下:

创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u mystatement);
listview=(listview)findViewById(R.id.listview);
adapter=new ArrayAdapter(这是android.R.layout.simple\u下拉列表\u项\u 1行,列表);
setAdapter(适配器);
dref=FirebaseDatabase.getInstance().getReference();
dref=dref.儿童(“狗儿支出”);
dref.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot子项:DataSnapshot.getChildren()){
HashMap值=(HashMap)child.getValue();
字符串金额=value.get(“金额”).toString();
String item=value.get(“item”).toString();
//这将打印出金额和项目
系统输出打印项次(金额+项目);
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}

我尝试了不同的方法来实现这一点,但我在这里并没有得到任何运气。我得到的只是这个错误java.lang.ClassCastException:java.lang.String不能转换为java.util.HashMap 在com.example.moses.farm.Mystatement$1.onDataChange(Mystatement.java:39)上,它指向这个HashMap value=(HashMap)child.getValue()代码行。我已经在这里呆了将近一个星期了,任何知道如何得到它的人都会真正帮助我

DatabaseReference dref=FirebaseDatabase.getInstance().getReference();
DatabaseReference dref = FirebaseDatabase.getInstance().getReference();
dref = dref.child("Dog Expenditure");

dref.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        HashMap<String, String> value = (HashMap<String, String>) dataSnapshot.getValue();
        String amount = value.get("amount");
        String item = value.get("item");
    }
    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {
    }
    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {
    }
    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});
dref=dref.儿童(“狗儿支出”); dref.addChildEventListener(新的ChildEventListener(){ @凌驾 公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){ HashMap值=(HashMap)dataSnapshot.getValue(); 字符串金额=value.get(“金额”); 字符串item=value.get(“item”); } @凌驾 公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){ } @凌驾 ChildRemoved上的公共void(DataSnapshot DataSnapshot){ } @凌驾 已移动ChildMoved上的公共void(DataSnapshot DataSnapshot,字符串s){ } @凌驾 已取消的公共void(DatabaseError DatabaseError){ } });
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u mystatement);
listview=(listview)findViewById(R.id.listview);
adapter=new ArrayAdapter(这是android.R.layout.simple\u下拉列表\u项\u 1行,列表);
setAdapter(适配器);
dref=FirebaseDatabase.getInstance().getReference();
dref=dref.儿童(“狗儿支出”);
dref.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot子项:DataSnapshot.getChildren()){
字符串amount=child.get(“amount”).toString();
String item=value.get(“item”).toString();
//这将打印出金额和项目
系统输出打印项次(金额+项目);
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}

使用此代码正确的方法是首先创建数据模型:

public class DogExpenditure {
    private String amount;
    private String item;

    public String getAmount() {
        return amount;
    }

    public void setAmount(String amount) {
        this.amount = amount;
    }

    public String getItem() {
        return item;
    }

    public void setItem(String item) {
        this.item = item;
    }
}
然后添加一个ChildEventListener:

dref.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        DogExpenditure dogExpenditure = dataSnapshot.getValue(DogExpenditure.class);
        System.out.println(dogExpenditure.getAmount()+dogExpenditure.getItem());
    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {

    }

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
HashMap value=child.getValue();
试试这个

更改此行的值。获取(“金额”).toString()

String.valueOf(value.get(“金额”);
它解决了我的问题。

可能是您的孩子返回了
字符串
请检查它…不确定这是否能解决问题,但您绝对不应该强制转换为HashMap。而是强制转换:
Map value=(Map)child.getValue()
@ManfredRadlwimmer java.lang.ClassCastException:java.lang.String不能强制转换为java.util。HashMap@SirGeorge我没有写答案,是卡蒂写的。我只是删除了in-bowser剪接标记-无法帮助您完成此操作。将对象替换为string@karthijava.lang.ClassCastException:java.lang.String不能强制转换为java.util.HashMapHashMap值=(HashMap)child.getValue();嘿,java.lang.ClassCastException:java.lang.String不能转换为java.util.HashMap errrorjava.lang.ClassCastException:java.lang.String不能转换为java.util.HashMapi注意到了一些非常奇怪的事情..在我的android studio控制台((监视器)我看到了我手动添加的firebase条目的值。也就是说,我的结构类似于这只狗的支出--KeT_Eehkkikjyo1HB5--金额:“12'000”--项目:“gsgag”,然后我手动添加了一个名为amount:“xxxx”的子项,仍然在狗的支出下,但现在没有唯一标识符“KeT_Eehkkikjyo1HB5”.控制台打印出xxxx。但不是具有唯一标识的原始值。这意味着至少您能够解决类型转换错误,对吗?请将检索代码发送给我,以便我可以在我的应用程序中尝试。我很荣幸在此
public class DogExpenditure {
    private String amount;
    private String item;

    public String getAmount() {
        return amount;
    }

    public void setAmount(String amount) {
        this.amount = amount;
    }

    public String getItem() {
        return item;
    }

    public void setItem(String item) {
        this.item = item;
    }
}
dref.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        DogExpenditure dogExpenditure = dataSnapshot.getValue(DogExpenditure.class);
        System.out.println(dogExpenditure.getAmount()+dogExpenditure.getItem());
    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {

    }

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});