重写数据更改函数时如何在外部范围内进行更改



我正在尝试从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 工作正常,但主要问题是 cities.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)
}
})

相关内容

最新更新