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"
}
}
}
答案 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。