База данных Firebase Realtime - сопоставление текущих данных с представлением в виде списка - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть прослушиватель дочерних событий, который регистрирует при добавлении нового дочернего элемента:

override fun onChildAdded(p0: DataSnapshot, p1: String?) {
Log.d("TAG", p0.child("name").getValue(String::class.java) + "/" + p0.child("telephone").getValue(String::class.java))
}


В моем Logcat выдается следующее:

D/TAG: John/123456
D/TAG: Lisa/12345688
D/TAG: Jeremy/999


Сейчас я пытаюсь отобразить результаты в реальном времени в виде списка в моей основной деятельности:

enter image description here


I никогда не делал этого раньше. Я запустил процесс, но мог бы использовать некоторую помощь, чтобы заставить его работать.

Я получаю всевозможные ошибки, используя некоторый код, который я нашел в Интернете:

enter image description here



MainActivity.kt

class MainActivity : AppCompatActivity() {

    private lateinit var mDatabase: DatabaseReference
    private lateinit var mListView: ListView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mDatabase = FirebaseDatabase.getInstance().reference

        mListView = findViewById(R.id.lv_show_users)

        val UserList = mDatabase.child("Users")

        val listItems = arrayOfNulls<String>(UserList.size)

        for (i in 0 until UserList.size) {
            val user = UserList[i]
            listItems[i] = user.name
        }

        val adapter = ArrayAdapter(this, listItems)

        mListView.adapter = adapter

        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?) {
                Log.d("TAG", p0.child("name").getValue(String::class.java) + "/" + p0.child("telephone").getValue(String::class.java))
            }

            override fun onChildRemoved(p0: DataSnapshot) {
                TODO("Not yet implemented")
            }

        }

        mDatabase.child("Users").addChildEventListener(childEventListener)

        bt_add_user.setOnClickListener {

            val name = et_user_name.text.toString().trim()
            val telephone = et_user_telephone.text.toString().trim()

            writeNewUser(name, telephone)
        }

    }

    private fun writeNewUser(name: String, telephone: String) {
        val user = Users(name, telephone)
        mDatabase.child("Users").push().setValue(user)
    }
}



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>

1 Ответ

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

Это не может работать:

val UserList = mDatabase.child("Users")

val listItems = arrayOfNulls<String>(UserList.size)

Первая строка просто определяет ссылку на местоположение в базе данных. Он пока не читает никаких данных.

Это означает, что UserList.size не существует, так как данные еще не загружены. Вы также можете увидеть, что при просмотре документации для DatabaseReference, которая не содержит size метод / свойство.

Обычный способ справиться с этим - это вначале определите список как пустой, а затем добавьте имена пользователей по мере их возвращения из базы данных.

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