ホームページ > Java > &#&チュートリアル > Android RecyclerView スクロール用に Firestore データを効率的にページネーションする方法?

Android RecyclerView スクロール用に Firestore データを効率的にページネーションする方法?

Patricia Arquette
リリース: 2024-12-27 13:00:13
オリジナル
434 人が閲覧しました

How to Efficiently Paginate Firestore Data for Android RecyclerView Scrolling?

スクロールを使用した Android RecyclerView の Firestore データのページ分割

問題の説明

Firestore ドキュメントでは、スクロール シナリオでの RecyclerView を使用したページ分割の実装に関する限定的なガイダンスが提供されています。公式ドキュメントに従っているにもかかわらず、ユーザーは問題に遭遇する可能性があります。

解決策: OnScrollListener によるページネーション

Firestore からのデータをページネーションし、RecyclerView で段階的に表示するには、次の手順に従います。

  1. RecyclerView を設定します: レイアウト マネージャーを構成し、空のリスト アダプターを使用して RecyclerView をインスタンス化します。
  2. Firestore クエリを定義します。 orderBy() メソッドと limit() メソッドを使用して、制限 (例: 15) で昇順にアイテムを取得します。 .
  3. 初期クエリの実行: 初期クエリを実行し、取得したデータをリストに追加します。アダプター。最後に表示されているドキュメントを表すように lastVisible を更新します。
  4. RecyclerView スクロール リスナー: ユーザーがリストの最後に近づいたことを検出するために、RecyclerView.OnScrollListener を RecyclerView に追加します。
  5. ページネーション ロジック: スクロールが検出され、リストの最後に到達していない場合は、 startAfter(lastVisible) を使用した新しいクエリ。取得したデータをリスト アダプターに追加し、lastVisible を更新します。
  6. 最後の項目を確認します: 新しいクエリが指定した制限よりも少ない値を返した場合、最後の項目に到達したことをマークし、無効にします。さらにページネーションします。

コード例

// ...

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

// ...
ログイン後にコピー

結論

提供されたソリューションは、スクロール シナリオでの RecyclerView のページネーションを効率的に処理します。ユーザーがスクロールするとタイムリーなデータ取得が保証され、シームレスな読み込みエクスペリエンスが提供されます。

以上がAndroid RecyclerView スクロール用に Firestore データを効率的にページネーションする方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート