android - Firebase 实时数据库 - ChildEventListener - 基础
问题描述
我创建了一个将用户添加到数据库的简单应用程序。
我现在正试图在我的活动中显示这些用户(实时更新)。
我创建了一个ListView
并且我相信我需要使用addChildEventListener
. 我以前从来没有这样做过,所以我会很感激一些帮助让它工作。
请在下面查看我的代码。谢谢你。
用户.kt
data class Users(
var name: String? = "",
var telephone: String? = ""
)
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_user_name"
android:hint="Name"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_user_telephone"
android:hint="Telephone"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/bt_add_user"
android:text="Add User"/>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/lv_show_users"/>
</LinearLayout>
MainActivity.kt
package com.example.only_db.ui
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.example.only_db.R
import com.example.only_db.db.Users
import com.google.firebase.database.*
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
private lateinit var mDatabase: DatabaseReference
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mDatabase = FirebaseDatabase.getInstance().reference
bt_add_user.setOnClickListener {
val name = et_user_name.text.toString().trim()
val telephone = et_user_telephone.text.toString().trim()
writeNewUser(name, telephone)
}
val childEventListener = object : ChildEventListener {
override fun onCancelled(p0: DatabaseError) {
TODO("Not yet implemented")
}
override fun onChildMoved(p0: DataSnapshot, p1: String?) {
TODO("Not yet implemented")
}
override fun onChildChanged(p0: DataSnapshot, p1: String?) {
TODO("Not yet implemented")
}
override fun onChildAdded(p0: DataSnapshot, p1: String?) {
TODO("Not yet implemented")
}
override fun onChildRemoved(p0: DataSnapshot) {
TODO("Not yet implemented")
}
}
mDatabase!!.addChildEventListener(childEventListener)
}
private fun writeNewUser(name: String, telephone: String) {
val user = Users(name, telephone)
mDatabase.child("Users").push().setValue(user)
}
}
解决方案
为了能够显示用户,您需要听取正确的参考。因此,您将User
对象推送到Users
节点中,但您正在侦听mDatabase
实际上是根引用的对象。要解决此问题,请更改以下代码行:
mDatabase!!.addChildEventListener(childEventListener)
到:
mDatabase.child("Users")!!.addChildEventListener(childEventListener)
除此之外,在您的方法中添加以下行onChildAdded()
以实际查看 logcat 中的结果。
Log.d("TAG", p0.child("name").getValue(String::class.java) + "/" + p0.child("telephone").getValue(String::class.java))
你会得到:
John/123456
Lisa/12345688
如果可行,请将结果映射到List<User>
对象并将其传递给适配器。
推荐阅读
- html - 我们如何使用带有可自定义控件的 ngFor formArrays?
- android - 当应用程序被系统杀死/重新启动时,Android 服务崩溃
- unity3d - 更快的编译 - 资产商店插件的编辑器文件夹
- swift - 快速实现 socket.io-client
- amazon-web-services - 为什么 EC2 实例的内存利用率不是 Amazon CloudWatch 的默认指标?
- javascript - 用于现代浏览器的 document.registerElement
- arrays - 从 json ReactJS 访问键和值
- mysql - 在 MySQL 5.7 中,我将如何选择少于 2 个相关子表行的所有父表行
- python - 如何在 pandas 数据框中的 1 个图形上绘制 2 个直方图
- regex - 如何从字节大小高于 62914560 B 的 XML 中删除某些行?