es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Popule el RecyclerView con la colección de FirestoreDatabase en Kotlin

Tengo una colección en mi Firestore con varios documentos. Estoy intentando recuperar esos documentos y poblar un RecyclerView con los datos. Si intento poblar el RecyclerView con una simple MutableList funciona, pero falla con los datos de Firestore.

var drills: MutableList<drill> = mutableListOf(
    Drill("Australia","Beroketa ariketa","irudia.com")
)

private fun populateList() {
    FirebaseFirestore.getInstance().collection("drills").document("Hamaika").get()
        .addOnSuccessListener {
                drills.add(Drill(it.get("izena") as String?, it.get("desk") as String?,
                    it.get("irudia") as String?
                ))
            }
        }

fun initRecycler(){
    recyclerViewId.layoutManager = LinearLayoutManager(this)
    val adapter = DrillAdapter(drills)
    recyclerViewId.adapter = adapter
}

También he intentado hacerlo con todos los documentos, pero el recyclerView se imprime vacío:

FirebaseFirestore.getInstance().collection("drills").get().addOnSuccessListener { result ->
        for (document in result) {
            val izena = document.get("izena") as String?
           val desk = document.get("desk") as String?
            val irudia = document.get("irudia") as String?
            val ariketa = Drill(izena, desk, irudia)
            drills.add(ariketa)}

¿Alguna idea de cómo hacer esto?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que la recuperación de datos de Firestore es una operación asíncrona, lo que significa que es posible que no haya terminado de recuperar los datos cuando se llena el RecyclerView con la MutableList. Una solución a esto es mover el código de población del RecyclerView dentro del callback de recuperación de Firestore, donde se garantiza que los datos se hayan recuperado.

    Para hacer esto, modifica la función populateList() para que tome un callback que se ejecutará una vez que todos los documentos se hayan recuperado y agregado a la MutableList:

    private fun populateList(callback: () -> Unit) {
        FirebaseFirestore.getInstance().collection("drills").get()
            .addOnSuccessListener { result ->
                for (document in result) {
                    val izena = document.get("izena") as String?
                    val desk = document.get("desk") as String?
                    val irudia = document.get("irudia") as String?
                    val ariketa = Drill(izena, desk, irudia)
                    drills.add(ariketa)
                }
                callback()
            }
    }
    

    Luego, modifica la función initRecycler() para llamar a populateList() con una función de lambda que actualizará el RecyclerView con los datos recuperados:

    fun initRecycler() {
        recyclerViewId.layoutManager = LinearLayoutManager(this)
        populateList {
            val adapter = DrillAdapter(drills)
            recyclerViewId.adapter = adapter
        }
    }
    

    Al hacer esto, el RecyclerView solo se llenará una vez que se hayan recuperado todos los documentos de Firestore y se hayan agregado a la MutableList.

Comments are closed.