Maison > Java > javaDidacticiel > Comment paginer efficacement les données Firestore pour le défilement Android RecyclerView ?

Comment paginer efficacement les données Firestore pour le défilement Android RecyclerView ?

Patricia Arquette
Libérer: 2024-12-27 13:00:13
original
435 Les gens l'ont consulté

How to Efficiently Paginate Firestore Data for Android RecyclerView Scrolling?

Pagination des données Firestore pour Android RecyclerView avec défilement

Description du problème

La documentation Firestore fournit des conseils limités sur la mise en œuvre de la pagination avec RecyclerView pour les scénarios de défilement. Malgré le respect de la documentation officielle, les utilisateurs peuvent rencontrer des difficultés.

Solution : Pagination avec OnScrollListener

Pour paginer les données de Firestore et les afficher progressivement dans une RecyclerView, suivez ces étapes :

  1. Configurer le RecyclerView : Configurer le gestionnaire de mise en page et instancier le RecyclerView avec un adaptateur de liste vide.
  2. Définissez la requête Firestore : Utilisez les méthodes orderBy() et limit() pour récupérer les éléments par ordre croissant avec une limite (par exemple, 15).
  3. Exécution initiale de la requête : Effectuez la requête initiale et ajoutez les données récupérées à l'adaptateur de liste. Mettez à jour lastVisible pour représenter le dernier document visible.
  4. Écouteur de défilement RecyclerView : Ajoutez un RecyclerView.OnScrollListener au RecyclerView pour détecter quand l'utilisateur approche de la fin de la liste.
  5. Logique de pagination : Si un défilement est détecté et que la fin de la liste n'est pas atteinte, effectuez une nouvelle requête en utilisant startAfter(lastVisible). Ajoutez les données récupérées à l'adaptateur de liste et mettez à jour lastVisible.
  6. Vérifiez le dernier élément : Si la nouvelle requête renvoie moins que la limite spécifiée, marquez que le dernier élément a été atteint et désactivez pagination supplémentaire.

Exemple de code

// ...

// Define the query limit
private val limit = 15

// Initial query
val query = productsRef.orderBy("productName", Query.Direction.ASCENDING).limit(limit)

query.get().addOnCompleteListener { task ->
    if (task.isSuccessful) {
        for (document in task.result!!) {
            val productModel = document.toObject(ProductModel::class.java)
            list.add(productModel)
        }
        productAdapter.notifyDataSetChanged()
        lastVisible = task.result!!.documents[task.result!!.size() - 1]

        // RecyclerView scroll listener
        recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                super.onScrollStateChanged(recyclerView, newState)
                if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
                    isScrolling = true
                }
            }

            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                super.onScrolled(recyclerView, dx, dy)

                val linearLayoutManager = recyclerView.layoutManager as LinearLayoutManager
                val firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition()
                val visibleItemCount = linearLayoutManager.childCount
                val totalItemCount = linearLayoutManager.itemCount

                if (isScrolling && (firstVisibleItemPosition + visibleItemCount == totalItemCount) && !isLastItemReached) {
                    isScrolling = false
                    val nextQuery =
                        productsRef.orderBy("productName", Query.Direction.ASCENDING).startAfter(lastVisible).limit(limit)
                    nextQuery.get().addOnCompleteListener { t ->
                        if (t.isSuccessful) {
                            for (d in t.result!!) {
                                val productModel = d.toObject(ProductModel::class.java)
                                list.add(productModel)
                            }
                            productAdapter.notifyDataSetChanged()
                            lastVisible = t.result!!.documents[t.result!!.size() - 1]

                            if (t.result!!.size() < limit) {
                                isLastItemReached = true
                            }
                        }
                    }
                }
            }
        })
    }
}

// ...
Copier après la connexion

Conclusion

Le fourni La solution gère efficacement la pagination pour RecyclerView dans un scénario de défilement. Il garantit une récupération rapide des données au fur et à mesure que l'utilisateur fait défiler, offrant une expérience de chargement transparente.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal