初めに
今回は、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
という関数名に納得いってないのも事実です。
慣れるしかないんでしょうかねぇ