0
0

More than 1 year has passed since last update.

リストのドラッグ&ドロップ終了時に通信をしたい

Posted at

初めに

今回は、epoxyを使ったRecyclerViewでドラッグ&ドロップを実装する時に少しわかりづらかった部分を紹介していこうと思います

本文

やりたいこととしては、RecyclerViewでドラッグ&ドロップが終わったタイミングで内部のデータの整理と通信処理を行いたいです。
この時に自分が詰まったのは意図せず通信が何度も走ってしまうという点でした。
原因としてはonModelMovedは1個要素がずれるたびに呼び出されるので通信処理が何回も呼び出されてしまっていたのです。
そこで、調べてみると要素の入れ替えが終わり、指が離されたときに呼び出されるcliearViewというのがありました。
なので、そのタイミングで内部データと通信処理を行うようにしました。
多少省略はしてますが、コードは下記の通りになります。

EpoxyTouchHelper.initDragging(controller)
            .withRecyclerView(binding.recycler)
            .forGrid()
            .forAllModels()
            .andCallbacks(object : EpoxyTouchHelper.DragCallbacks<EpoxyModel<*>>() {
                override fun onModelMoved(
                    fromPosition: Int,
                    toPosition: Int,
                    modelBeingMoved: EpoxyModel<*>?,
                    itemView: View?
                ) {
                    viewModel.onImageMoved(fromPosition = fromPosition, toPosition = toPosition)
                }

                override fun clearView(model: EpoxyModel<*>?, itemView: View?) {
                    if (itemView != null) {
                        resetView()
                    }
                }
            })

最後に

名前的にonModelMovedが期待している関数なのかと思いましたが、よくよく考えてみると確かにonModelMovedという名前じゃないと、
1個ずつ動いたことを感知する関数に対しての名前に代替案がないなぁと思いました。
ただclearViewという関数名に納得いってないのも事実です。
慣れるしかないんでしょうかねぇ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0