Jetpackの作成:リストのドラッグアンドドロップの並び替え



私は私が働いているだけで、Jetpackのcomposeを使用してすべての私のAndroidアプリを再書き込みを停止したいと思います.書き込み時に、これはすべてのアプリケーションのための最良の決定ではない可能性があります.
ご存知のように、構成は確かに安定した形です(つまり、パフォーマンスは素晴らしいですし、APIは変更されません)が、他の期待するが、まだ実装されていないいくつかの機能があります.
私のアプリの1つを移植しながら、私はそのような機能につまずいた:ドラッグアンドドロップの順序を変更します.
があるactive feature request そしてdrag-and-drop support in the roadmap しかし、現時点では公式の回避策はない.クイック検索機能のいくつかの手動実装を明らかにする.しかし、私の意見では、現時点で最も良い回避策はComposeReorderable library すべての実装の詳細を抽象化しながら機能を実装します.

ドラッグアンドドロップ効果は完璧ではないかもしれないが、それは公式の解決策があるまで仕事を取得します.これを達成するために、迅速なコード断片を見てみましょう.
    val state = rememberReorderState() // 1.
    val tasks by viewModel.getTasks().observeAsState(listOf())

    LazyColumn(
        state = state.listState,
        modifier = Modifier
            .reorderable(state, { fromPos, toPos -> // 2.
                viewModel.onTaskReordered(tasks, fromPos, toPos)
            })
            .detectReorderAfterLongPress(state) // 3.
    ) {
        items(tasks, key = { task -> task.id }) { task ->
            Text(
                task.text,
                Modifier
                    .draggedItem(state.offsetByKey(task.id)) // 4.
            )
        }
    }
  • インストールlibrary 以下を加えることによってbuild.gradle 覚えておいてくださいlatest version ) :
  •  implementation("org.burnoutcrew.composereorderable:reorderable:0.7.0")
    
    
  • The state 通常の怠惰リストではリストのスクロール位置を保持しています.ライブラリは、ドラッグアンドドロップの再注文を実行するための独自の状態を必要とします.
  • 追加するreorderable リスト内の2つの項目がドラッグ中に場所を変更すると、何が起こるかを指定します.私たちのケースでは、一方向のアーキテクチャに従って、内部状態を更新し、その後ビューを更新する変更について通知されます.
  • このdetectReorderAfterLongPress 修飾子は、リスト全体または特定のリスト項目のいずれかで宣言できます.リストの上で宣言されるならば、すべてのアイテムは償還できます.特定の項目で宣言されるならば、それらだけは償還できます(彼らの残りは動かない).
  • これは、リスト内の項目をドラッグするときにライブラリによって提供される既定の視覚効果です.
  • 私の意見では、これはJetpackの構成のリストのためのドラッグアンドドロップの並べ替えを今すぐに持っている非常にまともな回避策です.Runderableリストを持っている公式の方法が利用可能であるとき、我々は再び観察を持つことができます.
    ハッピーコーディング!