Kotlin / Firebase获取对象列表

时间:2019-02-15 00:21:29

标签: firebase kotlin

如何从实时数据库获取对象列表?

我正在尝试获取对象的列表,以将列表发送给我的适应者并打印该列表,因此我想获取该列表。

如此糟糕的是下面的代码:

    myRef.addListenerForSingleValueEvent(object : ValueEventListener {
        override fun onCancelled(snapshotError: DatabaseError) {
            TODO("not implemented")
        }

        override fun onDataChange(snapshot: DataSnapshot) {
            val children = snapshot!!.children
            children.forEach {
                println(it.toString()) // its working.
            }
        }
    })

我的课:

data class MyClass(val name: String, val description: String, val fromDate: Long, val toDate: Long)

我不知道如何在 onDataChange 中设置列表列表。我想应该是下面的代码,但不确定是否是最好的方法:

private val list : MutableList<MyClass> = mutableListOf()
    myRef.addListenerForSingleValueEvent(object : ValueEventListener {
        override fun onCancelled(snapshotError: DatabaseError) {
            TODO("not implemented") 
        }

        override fun onDataChange(snapshot: DataSnapshot) {
            for (objSnapshot in snapshot.getChildren()) {
                val myClass= objSnapshot .getValue(MyClass::class.java)
                list.add(myClass!!)
            }
        }
    })

1 个答案:

答案 0 :(得分:0)

您可以将lambda用作回调,以便在检索数据时得到通知,例如:

fun loadList(callback: (list: List<MyClass>) -> Unit) {
    myRef.addListenerForSingleValueEvent(object : ValueEventListener {
        override fun onCancelled(snapshotError: DatabaseError) {
            TODO("not implemented") 
        }

        override fun onDataChange(snapshot: DataSnapshot) {
            val list : MutableList<MyClass> = mutableListOf()
            val children = snapshot!!.children
            children.forEach {
                list.add(it.getValue(MyClass::class.java))
            }
            callback(list)
        }
    })
}

调用该函数时,您可以在末尾指定lambda,以便在加载列表时得到通知:

loadList {
    // `it` contains the list
}