RecyclerView は、大規模なデータセットを簡単かつ効率的に表示できる View コンポーネントです。RecyclerView は、データセット内の各アイテムのビューを作成するのではなく、ビューの小さなプールを保持し、アイテムをスクロールする際にそれらを再利用することで、アプリのパフォーマンスを向上させます。
Compose では、遅延リストを使用して同じことを実現できます。このページでは、RecyclerView の実装を移行して Compose で Lazy リストを使用する方法について説明します。
移行手順
RecyclerView の実装を Compose に移行する手順は次のとおりです。
UI 階層から
RecyclerViewをコメントアウトまたは削除し、階層にまだComposeViewが存在しない場合は、それを追加して置き換えます。追加する Lazy リストのコンテナは次のとおりです。<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- <androidx.recyclerview.widget.RecyclerView--> <!-- android:id="@+id/recycler_view"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="match_parent />"--> <androidx.compose.ui.platform.ComposeView android:id="@+id/compose_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>RecyclerViewのレイアウト マネージャーに基づいて、必要な Lazy リスト コンポーザブルのタイプを決定します(下の表を参照)。選択したコンポーザブルは、前の手順で追加したComposeViewの最上位のコンポーザブルになります。LayoutManagerコンポーザブル
LinearLayoutManagerLazyColumnまたはLazyRowGridLayoutManagerLazyVerticalGridまたはLazyHorizontalGridStaggeredGridLayoutManagerLazyVerticalStaggeredGridまたはLazyHorizontalStaggeredGrid// recyclerView.layoutManager = LinearLayoutManager(context) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { // We use a LazyColumn since the layout manager of the RecyclerView is a vertical LinearLayoutManager } }
RecyclerView.Adapter実装の各ビュータイプに対応するコンポーザブルを作成します。通常、各ビュータイプはViewHolderサブクラスにマッピングされますが、必ずしもそうとは限りません。これらのコンポーザブルは、リスト内のさまざまなタイプの要素の UI 表現として使用されます。@Composable fun ListItem(data: MyData, modifier: Modifier = Modifier) { Row(modifier.fillMaxWidth()) { Text(text = data.name) // … other composables required for displaying `data` } }
RecyclerView.AdapterのonCreateViewHolder()メソッドとonBindViewHolder()メソッドのロジックは、これらのコンポーザブルと、それらに提供する状態に置き換えられます。Compose では、アイテムのコンポーザブルの作成とデータへのバインディングが分離されていません。これらのコンセプトは統合されています。Lazy リストの
contentスロット(後置ラムダ パラメータ)内で、items()関数(または同等のオーバーロード)を使用して、リストのデータを反復処理します。itemContentラムダで、データに適したコンポーザブル アイテムを呼び出します。val data = listOf<MyData>(/* ... */) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { items(data) { ListItem(it) } } }
一般的なユースケース
アイテムの装飾
RecyclerView には ItemDecoration のコンセプトがあり、これを使用してリスト内のアイテムに特別な描画を追加できます。たとえば、ItemDecoration を追加して、アイテム間に区切り線を追加できます。
val itemDecoration = DividerItemDecoration(recyclerView.context, LinearLayoutManager.VERTICAL) recyclerView.addItemDecoration(itemDecoration)
Compose には、アイテム装飾に相当するコンセプトはありません。代わりに、リスト内の UI 装飾をコンポジションに直接追加できます。たとえば、リストに区切り線を追加するには、各項目の後に Divider コンポーザブルを使用します。
LazyColumn(Modifier.fillMaxSize()) { itemsIndexed(data) { index, d -> ListItem(d) if (index != data.size - 1) { HorizontalDivider() } } }
アイテム アニメーション
RecyclerView に ItemAnimator を設定して、アダプターが変更されたときにアイテムの表示をアニメーション化できます。デフォルトでは、RecyclerView は DefaultItemAnimator を使用します。これは、削除、追加、移動のイベントで基本的なアニメーションを提供します。
遅延リストには、animateItemPlacement 修飾子を通じて同様のコンセプトがあります。詳しくは、アイテム アニメーションをご覧ください。
参考情報
RecyclerView を Compose に移行する方法について詳しくは、以下のリソースをご覧ください。
- リストとグリッド: Compose でリストとグリッドを実装する方法に関するドキュメント。
 - Jetpack Compose の相互運用: RecyclerView で Compose を使用する: 
RecyclerView内で Compose を効率的に使用するためのブログ投稿。 
あなたへのおすすめ
- 注: JavaScript がオフになっている場合はリンクテキストが表示されます
 - リストとグリッド
 CoordinatorLayoutを Compose に移行する- その他の考慮事項