この記事を書くことにしました Googleがかなり前にリリースしたにもかかわらず、多くの開発者がRecyclerView
を使用するときにミスをすることに気付きました。
ここで説明するポイントは、Google Devsのさまざまなレポートや資料で言及されています。
この記事では、 このビデオの重要なポイントについて簡単に説明しますが、今すぐ見る必要はありません。 しかし、私は記事を読んだ後、完全に見ることを推奨します。
1. setHasFixedSize属性
recyclerView
がその子を動的にサイズ変更する予定がない場合、属性recyclerView.setHasFixedSize(true)
設定します。
その結果、リストアイテムでデータが更新されるたびにrecyclerView
は再描画されず、このアイテム自体が再描画されます。
2.クリックリスナー
onCreateViewHolder(...)
でクリックハンドラーを設定します。
ユーザーがリスト項目をクリックするたびに、 viewHolder
はこのクリックが発生したアダプターの位置を報告します( vh.getAdapterPosition()
)。 エレメントはアダプター内で移動でき、関連付けられたview
コンポーネントは再作成されないため、これは重要です。
その結果、 view
コンポーネントが作成されるまでに、次のことが発生する可能性があります。たとえば、リストアイテムは位置2にありますが、ユーザーがクリックすると、要素はすでに位置5になります。したがって、 vh.getAdapterPosition()
正しいリストインデックスが受信されるようにします。
3.さまざまなタイプのビューコンポーネントの使用
異なるタイプのview
コンポーネント(たとえば、 R.layout.view_one
)を使用する場合は、 layout
直接返しlayout
。
アダプターがさまざまなタイプのview
コンポーネントをサポートしている場合、 getItemViewType
およびonCreateViewHolder
は以下の画像のようになります。 対応するタイプのview
コンポーネントに必要なロジックを実装するには、 onCreateViewHolder
メソッド内にswitch
を記述する必要があります。
ただし、これらのタイプの代わりに、すぐにlayout
を返すことができます。 これにより、 onCreateViewHolder
ボイラープレートコードがonCreateViewHolder
。
この手法は、常に使用することはできません。 場合によっては、選択した各layout
内で、さまざまなケースでより複雑なロジックが必要になることがあります。 ただし、これが当てはまらない場合、返されるlayout
は、さまざまなタイプのview
コンポーネントを操作する正しい方法です。
4. DiffUtil
DiffUtil
を使用して新しいデータをRecyclerView
に追加します。
recyclerView
のデータが変更されるたびに、ほとんどの開発者はnotifyDataSetChanged()
メソッドを呼び出して、更新されたデータをUIに表示します。 彼らは、この方法がリソース集約型であること、そしてこれがDiffUtil
がはるかに効率的に処理する場所であることを単純に知りません。
DiffUtil
は、2つのリストの差を更新リストとして計算し、最初のリストを2番目のリストに変換できるユーティリティクラスです。 recyclerView
アダプターで更新を計算するために使用できます。 DiffUtil
を使用するには、 DiffUtil
を実装する必要があります。これには、 DiffUtil
ロジックを実装するために必要ないくつかのメソッドがあります。
DiffUtil
の最大の利点は、 RecyclerView
では、リスト全体を再描画する代わりにTextView
特定の要素のTextView
内の特定のテキストを更新できることTextView
。 これを行うには、 onChangePayload
メソッドを実装する必要があります。 このテーマに関する非常に良い記事があります。
2番目の部分では、 RecyclerView
活用するためのその他のヒントを見ていきます。
→RecyclerViewを専門的に使用するためのヒント。 パート2