web-dev-qa-db-ja.com

RecyclerViewのsetRecycledViewPoolメソッド

mrecyclerViewがRecyclerViewオブジェクトである次のコード行で、setRecycledViewPoolメソッドがRecyclerViewとともに実際に何を行うかを理解しようとしています。

mrecyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool());

Androidドキュメント リンク を読みましたが、それが何を明確に示しているのかまだわかりません。誰かがその使用法といつ使用するかを説明してもらえますか?

5
Abhilash Reddy

setRecycledViewPool(...)は、ネストされたRecyclerViewがある場合に役立ちます。詳細については、 this ブログ投稿を参照してください。同じリンクの簡単な説明がここに追加されます。

ネストされたRecyclerViewsと内部のRecycleViewsが同じビュー構造を共有している場合を考えてみます。 RecycledViewPoolは、これらの内部(ネストされた)RecyclerViews間でビューを共有するためのseemless方法を提供します。

このようなケースの例は、次の画像で見ることができます。

enter image description here

ご覧のとおり、両方のリストのビューのタイプは同じです。

7
Alex Kisel

から docs

リサイクルビュープールを使用すると、複数のRecyclerViewがスクラップビューの共通プールを共有できます。これは、同じビュータイプを使用するアダプタを備えた複数のRecyclerViewがある場合、たとえば、同じ種類のデータセットが複数ある場合に役立ちます。 ViewPagerによって表示されるアイテムビュー。

デフォルトでは、5つのViewHoldersが特定のviewTypeのプールに保持されます。そのカウントを変更したい場合は、次のように行うことができます。

recyclerView.getRecycledViewPool()
            .setMaxRecycledViews(SOME_VIEW_TYPE, POOL_CAPACITY);

this ブログ投稿から:

では、プールの最適なサイズをどのように選択するのでしょうか。最適な戦略は、プールを大きくする必要がある直前にプールを拡張し、直後にプールを縮小することだと思われます。これを実装するための1つの汚い方法は次のとおりです。

recyclerView.getRecycledViewPool().setMaxRecycledViews(0, 20);
adapter.notifyDataSetChanged();
new Handler().post(new Runnable() {
    @Override
    public void run() {
        recyclerView.getRecycledViewPool()
                    .setMaxRecycledViews(0, 1);
    }
});
13
azizbekian

RecyclerViewが同時に画面に5つ以上のビューを表示することが予想される場合(現在のデフォルトは5)、最大と思われるサイズに拡大することをお勧めします。これにより、スクロール時に実際のリサイクル(RecyclerView ...の目的)を実行して、ビューの再作成を回避できます。

実際、画面に表示される数(画面の解像度の違いなど)はほとんどわからないと思うので、最大値に設定するのが最善だと思います。

fun RecyclerView.setMaxViewPoolSize(maxViewTypeId: Int, maxPoolSize: Int) {
    for (i in 0..maxViewTypeId)
        recycledViewPool.setMaxRecycledViews(i, maxPoolSize)
}

使用法:

    recyclerView.setMaxViewPoolSize(MAX_TYPE_FOR_THE_ADAPTER_YOU_MADE, Int.MAX_VALUE)

なぜそれがデフォルトの動作ではないのか私は個人的に理解していません。 RecyclerViewを使用することの全体的なポイントは、ビューをリサイクルすることです。スクロールする場合、デフォルトでは、使用したばかりのビューをリサイクルする必要があります。

1

私自身は使用していませんが、ドキュメントを読んで理解できることから、あるRecyclerViewでリサイクルするビューを別のRecyclerViewで使用する方法です。

したがって、多数のCardViewがデックアウトされたRecyclerViewがあり、それらの同じビューを別のRecyclerViewにリサイクルしたい場合は、共有RecycledViewPoolを渡すことができます。これで、両方のRecyclerViewが共有ビュープールから取得されます。

0
DejanRistic