Jetpack ComposeのLazyRow — 概要、プロパティ、動作方法

著者: IT Sectr 公開日: 2026-06-29 読了時間: 10 分

LazyRow — は、Jetpack Composeで要素を遅延読み込みする水平リストを作成するためのコンポーザブル関数です。Rowとは異なり、LazyRowは表示されている要素のみを作成し、水平スクロール時にそれらを再利用します。Google Android Documentation, 2025によると、LazyRowはLazyColumnの水平版であり、モバイルアプリケーションのカルーセル、ギャラリー、水平メニューに効果的です。

主なポイント

  • LazyRow — 遅延読み込みを備えたJetpack Composeの水平リストで、水平スクロール時に表示要素のみを作成します。
  • horizontalArrangement は要素の水平配置を管理し、contentPaddingはコンテナの端にパディングを追加します。
  • LazyListState は水平スクロール位置を追跡し、animateScrollToItemによるプログラム制御を提供します。
  • LazyRow はモバイルインターフェースの画像カルーセル、カテゴリリスト、水平ギャラリー、タブに効果的です。
  • contentTypekey はLazyRowの要素再利用を最適化し、スクロール時の再コンポジションを削減します。

Jetpack ComposeのLazyRowとは

LazyRow — は、要素を遅延読み込みする水平スクロール可能リストを実装するコンポーザブル関数です。すべての子要素を同時にレンダリングするRowとは異なり、LazyRowはビューポート内の表示要素のみを作成します。

LazyRowはLazyColumnと同じ原理で動作しますが、要素を水平に配置します。左右にスクロールすると、ビューポートから外れた要素が再利用されて新しい要素が表示されます。これは、多数の画像を含むギャラリーや長いカテゴリリストにとって非常に重要です。

Android Developers Blog, 2024によると、LazyRowはLazyColumnと同じLazyListアーキテクチャを使用しており、LazyListState、Poolによる再利用メカニズム、異なる要素タイプのサポートが含まれています。最大の効率は、要素の高さを固定することで達成されます。

LazyRowの基本シグネチャ

LazyRow は、modifier、state、contentPadding、reverseLayout、horizontalArrangement、verticalAlignmentのパラメータを受け入れます。コンテンツはLazyColumnと同様にDSL関数itemsとitemで定義されます。

kotlin
@Composable
fun SimpleLazyRow() {
    val items = (1..50).toList()
    LazyRow(
        modifier = Modifier.fillMaxWidth().height(100.dp),
        horizontalArrangement = Arrangement.spacedBy(8.dp),
        contentPadding = PaddingValues(start = 16.dp, end = 16.dp)
    ) {
        items(items) { item ->
            Box(
                modifier = Modifier.size(80.dp).background(Color.Gray)
            ) {
                Text(text = "$item", modifier = Modifier.align(Alignment.Center))
            }
        }
    }
}

LazyRowのプロパティ: horizontalArrangementとcontentPadding

horizontalArrangement は、LazyRow内の水平軸に沿った要素の分布を管理します。Rowと同じArrangement値が使用可能です: Start、Center、End、SpaceBetween、SpaceEvenly、SpaceAround、およびカスタム間隔のspacedBy。

contentPadding は、LazyRowコンテナの端にパディングを追加します。Modifier.paddingとは異なり、contentPaddingはスクロール時に考慮されます。最初の要素は左端から、最後の要素は右端からパディングが適用されます。Material Design Guidelines, 2025によると、カルーセルやギャラリーでは、最初と最後の要素が画面端に張り付かないようにcontentPaddingが必須です。

verticalAlignment は、LazyRow内で要素を垂直に整列します。デフォルトではAlignment.Topが使用されます。異なる高さの要素を中央揃えにするには、Alignment.CenterVerticallyを使用します。これは、異なるアスペクト比の画像を含むカルーセルに便利です。

LazyRowパラメータテーブル

パラメータ説明デフォルト値
horizontalArrangement要素の水平分布Arrangement.Start
contentPaddingコンテナ端のパディングPaddingValues(0.dp)
verticalAlignment垂直配置Alignment.Top
reverseLayout要素の逆順false
userScrollEnabledユーザースクロール有効true

LazyListStateによる水平スクロール管理

LazyListState はLazyRowの場合もLazyColumnと同様に機能します。最初の表示要素、オフセット、全体的なスクロール位置を追跡します。状態はrememberLazyListState()で作成され、stateパラメータに渡されます。

LazyRow のプログラムによるスクロール制御は同じメソッドで行われます。スムーズなアニメーションにはanimateScrollToItem、即時スクロールにはscrollToItemを使用します。どちらもコルーチン内で呼び出されます。これは、左右ボタン付きのカルーセルや自動スクロールに便利です。

Android Developers, 2024によると、LazyRowはSnapFlingBehaviorもサポートしています — これは、要素間ではなく最も近い要素で停止する高速スクロール動作です。これにより、カルーセルやギャラリーでおなじみのスナップ効果が生まれます。

kotlin
@Composable
fun CarouselWithSnap() {
    val listState = rememberLazyListState()
    val scope = rememberCoroutineScope()
    val items = listOf("A", "B", "C", "D", "E")

    Column {
        LazyRow(
            state = listState,
            flingBehavior = SnapFlingBehavior(listState),
            horizontalArrangement = Arrangement.spacedBy(8.dp)
        ) {
            items(items) { item ->
                Card(modifier = Modifier.width(150.dp)) {
                    Text(text = item, modifier = Modifier.padding(16.dp))
                }
            }
        }

        Row(modifier = Modifier.fillMaxWidth()) {
            Button(onClick = {
                scope.launch {
                    listState.animateScrollToItem(0)
                }
            }) { Text("開始するには") }
        }
    }
}

インターフェースでのLazyRowの使用例

最初の例 — プレビュー付き画像ギャラリー用のLazyRow。各要素は画像とキャプションを含むBoxです。LazyRowは数十から数百の画像を効率的に処理し、表示されているものだけを読み込みます。

kotlin
@Composable
fun ImageGallery(images: List<String>) {
    LazyRow(
        contentPadding = PaddingValues(start = 16.dp, end = 16.dp),
        horizontalArrangement = Arrangement.spacedBy(12.dp)
    ) {
        items(images, key = { it }) { url ->
            AsyncImage(
                model = url,
                contentDescription = "Image",
                modifier = Modifier.size(120.dp)
            )
        }
    }
}

2番目の例 — アイコン付きカテゴリリスト用のLazyRow。カテゴリはチップとして表示され、ユーザーは水平にスクロールできます。spacedByとcontentPaddingを備えたLazyRowは、カテゴリ間と端に間隔を作成します。

kotlin
@Composable
fun CategoryChips(categories: List<String>) {
    LazyRow(
        contentPadding = PaddingValues(horizontal = 16.dp),
        horizontalArrangement = Arrangement.spacedBy(8.dp)
    ) {
        items(categories, key = { it }) { category ->
            AssistChip(
                onClick = {},
                label = { Text(category) }
            )
        }
    }
}

LazyRow vs Row: どちらを選ぶべきか

LazyRow とRowの選択は要素数によって異なります。Rowは常に画面に表示される5–10個の要素に適しています。LazyRowは要素が多い場合や数が動的な場合に必要です。

Row はすべての要素を一度にレンダリングするため、要素数が多いと遅延が発生します。LazyRowは表示要素のみをレンダリングするため、スクロール可能なリストに適しています。Android Developers Blog, 2024によると、閾値は約10要素です。それ以上の要素がある場合はLazyRowを使用してください。

LazyRow はアニメーション、SnapFlingBehavior、セパレータによるグループ化もサポートしており、複雑なインターフェースにより柔軟に対応できます。RowはよりシンプルでLazyListStateを必要としませんが、長いリストには最適化されていません。

  • Row — スクロールなしの5–10個の静的要素用
  • LazyRow — 水平スクロール付きの10+要素用
  • LazyRow — カルーセル、ギャラリー、動的リスト用

よくある質問

LazyRowとLazyColumnの違いは何ですか?

LazyRow は水平にスクロールし要素を左から右に配置しますが、LazyColumnは垂直に上から下にスクロールします。どちらも同じ遅延読み込みの原則、LazyListState、DSL items関数を使用します。

LazyRowにSnapFlingBehaviorを追加するには?

SnapFlingBehavior(listState) をLazyRowのflingBehaviorパラメータに渡します。SnapFlingBehaviorにより、LazyRowは要素間ではなく最も近い要素で停止し、カルーセル用のスナップ効果が生まれます。

無限スクロールのLazyRowを作成するには?

LazyListState.layoutInfo で最後の表示要素を追跡し、最後の要素がリストの終わりに近づいたら新しいデータを読み込みます。循環スクロールには、要素を複製するカスタム実装を使用します。

LazyRowをLazyColumn内で使用できますか?

はい、LazyRow はLazyColumn内にネストできます。これは垂直リスト内に水平カルーセルを持つ複雑なページを作成する標準的なパターンです。各LazyRowは正しく動作するために固定の高さが必要です。

LazyRowが最後までスクロールされたことを検出するには?

LazyListState.layoutInfo.visibleItemsInfo を使用し、最後の表示要素のインデックスを総数から1を引いたものと比較します。これらの値が一致すると、LazyRowはリストの最後にあります。

まとめ

  • LazyRow — 遅延読み込みを備えた水平リストで、スクロール時に表示要素のみを作成・再利用して大規模データを効率的に処理します。
  • horizontalArrangement は要素の水平分布を管理し、contentPaddingはMaterial Designでの正しい表示のために端にパディングを追加します。
  • LazyListState はanimateScrollToItemによるプログラムスクロール制御を提供し、要素へのスナップ用にSnapFlingBehaviorをサポートします。
  • LazyRow はモバイルインターフェースの画像カルーセル、ギャラリー、カテゴリリスト、タブ、水平メニューに効果的です。
  • contentTypekey は、再コンポジションを削減しLazyRowの要素再利用を改善する主要な最適化ツールです。
  • Row は5–10個の静的要素に適し、LazyRowはスクロール付きの動的または長い水平リストに適します。
  • LazyRow はLazyColumn内にネストして、垂直リスト内に水平カルーセルを持つ複雑なレイアウトを作成できます。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください