Heim > Java > javaLernprogramm > Wie kann ich Firestore-Daten für Android RecyclerView Scrolling effizient paginieren?

Wie kann ich Firestore-Daten für Android RecyclerView Scrolling effizient paginieren?

Patricia Arquette
Freigeben: 2024-12-27 13:00:13
Original
434 Leute haben es durchsucht

How to Efficiently Paginate Firestore Data for Android RecyclerView Scrolling?

Paginierung von Firestore-Daten für Android RecyclerView mit Scrollen

Problembeschreibung

Die Firestore-Dokumentation bietet begrenzte Anleitungen zur Implementierung der Paginierung mit RecyclerView für Scrollszenarien. Trotz Befolgung der offiziellen Dokumentation können Benutzer auf Schwierigkeiten stoßen.

Lösung: Paginierung mit OnScrollListener

Um Daten aus Firestore zu paginieren und schrittweise in einem RecyclerView anzuzeigen, befolgen Sie diese Schritte:

  1. RecyclerView einrichten: Layout-Manager konfigurieren und RecyclerView instanziieren mit einem leeren Listenadapter.
  2. Definieren Sie die Firestore-Abfrage: Verwenden Sie die Methoden orderBy() und limit(), um Elemente in aufsteigender Reihenfolge mit einem Limit (z. B. 15) abzurufen.
  3. Erste Abfrageausführung: Führen Sie die erste Abfrage durch und fügen Sie die abgerufenen Daten dem Listenadapter hinzu. Aktualisieren Sie lastVisible, um das letzte sichtbare Dokument darzustellen.
  4. RecyclerView Scroll-Listener: Fügen Sie einen RecyclerView.OnScrollListener zu RecyclerView hinzu, um zu erkennen, wenn sich der Benutzer dem Ende der Liste nähert.
  5. Paginierungslogik: Wenn ein Scrollen erkannt wird und das Ende der Liste nicht erreicht wird, führen Sie a aus neue Abfrage mit startAfter(lastVisible). Fügen Sie die abgerufenen Daten dem Listenadapter hinzu und aktualisieren Sie lastVisible.
  6. Auf letztes Element prüfen: Wenn die neue Abfrage weniger als den angegebenen Grenzwert zurückgibt, markieren Sie, dass das letzte Element erreicht wurde, und deaktivieren Sie es weitere Paginierung.

Codebeispiel

// ...

// 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
                            }
                        }
                    }
                }
            }
        })
    }
}

// ...
Nach dem Login kopieren

Fazit

Die Die bereitgestellte Lösung verwaltet die Paginierung für RecyclerView in einem Scrolling-Szenario effizient. Es gewährleistet den zeitnahen Datenabruf beim Scrollen durch den Benutzer und sorgt so für ein nahtloses Ladeerlebnis.

Das obige ist der detaillierte Inhalt vonWie kann ich Firestore-Daten für Android RecyclerView Scrolling effizient paginieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage