首页 > 解决方案 > 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)
    }
}

标签: androidfirebasekotlinfirebase-realtime-database

解决方案


为了能够显示用户,您需要听取正确的参考。因此,您将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>对象并将其传递给适配器。


推荐阅读