java.lang.String无法强制转换为java.util.HashMap Kotlin中的错误

时间:2018-03-26 19:03:31

标签: android firebase firebase-realtime-database kotlin real-time

class MainActivity : AppCompatActivity() {
    var adapter : MyTrackers.ContactAdapter?=null
    var listOfContact = ArrayList<UserContact>()
    var databaseRef:DatabaseReference?=null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    var userData = UserData(this)
    userData.loadPhoneNumber()

    databaseRef = FirebaseDatabase.getInstance().reference

    //For debug only
    //dummyData()

    adapter = MyTrackers.ContactAdapter(this, listOfContact)
    lvContactList.adapter = adapter
    lvContactList.onItemClickListener = AdapterView.OnItemClickListener{
        parent, view, position, id ->
        val userInfo = listOfContact[position]
        UserData.myTrackers.remove(userInfo.phoneNumber)
    }

}

override fun onResume() {
    super.onResume()
    refereshUsers()
}

fun refereshUsers(){
    val userData = UserData(this)
    if(userData.loadPhoneNumber()=="empty"){ //FirstTIme activity Starts
        return
    }
    databaseRef!!.child("Users").child(userData.loadPhoneNumber())
            .child("Finders").addValueEventListener(object : ValueEventListener{


                override fun onDataChange(dataSnapshot: DataSnapshot) {
                    val td = dataSnapshot!!.value as HashMap<String,Any>
                    listOfContact.clear()

                    if(td==null){
                        listOfContact.add(UserContact("NO_USERS","Nothing"))
                        adapter!!.notifyDataSetChanged()
                        return
                    }

                    for (key in td.keys){
                        listOfContact.add(UserContact("NO_NAME",key))
                    }

                }

我总是得到上面的java.lang.String不能在我的onDataChange方法的td声明中强制转换为java.util.HashMap。每当我尝试根据以前的stackoverflow解决方案进行调试时,它仍然无法正常工作,有人可以告诉我我正在做出什么错误以及如何进行必要的更正。

这是我的数据库的结构

 "Users" : {
    "7151418" : {
      "Finders" : "2018/03/26 20:03:02",
      "request" : "2018/03/26 20:03:02"
    }
  }
}

2 个答案:

答案 0 :(得分:0)

正如文件所述:

  

getValue()将本快照中包含的数据作为本机返回   类型。返回的可能类型是:

     

Boolean
  String
  Long
  Double
  Map<String, Object>
  List<Object>

因此,在您的情况下,dataSnapshot!!.value会返回String

答案 1 :(得分:0)

要解决此问题,请更改以下代码行:

val td = dataSnapshot!!.value as HashMap<String,Any>

val td = dataSnapshot!!.value as String

Finders属性的值实际上是String而不是HashMap。