База данных Firebase в реальном времени - ChildEventListener - Основы - PullRequest
0 голосов
/ 16 апреля 2020

Я создал простое приложение, которое добавляет пользователей в базу данных.

Я сейчас пытаюсь отобразить этих пользователей в своей активности (обновление в реальном времени).

Я создал ListView и считаю, что мне нужно присвоить данные этому списку (массив?), Используя addChildEventListener. Я никогда не делал этого раньше, поэтому я был бы признателен за помощь в его работе.

Пожалуйста, смотрите мой код ниже. Спасибо.

Users.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)
    }
}

1 Ответ

0 голосов
/ 16 апреля 2020

Чтобы иметь возможность отображать пользователей, вам необходимо выслушать правильную ссылку. Таким образом, вы помещаете User объекты в узел Users, но вы слушаете mDatabase, который на самом деле является ссылкой root. Чтобы решить эту проблему, измените следующую строку кода:

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> объекты и передайте его адаптеру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...