我正在尝试从Firebase获取数据,对其进行迭代并将其添加到数组中。但我不能通过onDataCreate函数执行此操作,因为它无法正常工作
package com.example.cities
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.ListView
import com.google.firebase.database.*
import kotlinx.android.synthetic.main.activity_show.*
class ShowActivity : AppCompatActivity() {
private lateinit var db: DatabaseReference
lateinit var listView: ListView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_show)
val cities = arrayListOf<String>("Test1")
db = FirebaseDatabase.getInstance().getReference("Cities")
db.addValueEventListener(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
TODO("not implemented")
}
override fun onDataChange(p0: DataSnapshot) {
for (i in p0.children) {
val city: String = i.value.toString()
cities.add(city)
println(city)
}
}
})
cities.add("Test2")
listView = findViewById(R.id.listview)
listView.adapter =
ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, cities)
}
}
Test1和Test2正常工作,但主要问题是city.add(city)不起作用,而println(city)起作用。如我所见,它无法进行超出范围的更改,因此我需要帮助。
addValueEventListener
是异步的并立即返回。onDataChange
每当查询结果可用时,都会在一段时间后调用。您的代码错误地假设结果立即可用。相反,您应该做的是在知道数据可用之后在回调中填充视图。
db.addValueEventListener(object : ValueEventListener {
override fun onDataChange(p0: DataSnapshot) {
// DATA FIRST BECOMES AVAILABLE HERE
for (i in p0.children) {
val city: String = i.value.toString()
println(city)
cities.add(city)
}
// ONLY POPULATE THE LISTVIEW WHEN THE DATA IS READY
listView = findViewById(R.id.listview)
listView.adapter = ArrayAdapter<String>(this@ShowActivity, android.R.layout.simple_expandable_list_item_1, cities)
}
})
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句