RecyclerViewのアイテムをスワイプで削除する方法

# 完成イメージ
RecyclerViewのアイテムをスワイプするとそのアイテムを削除できる。
完成品は[こちらのGitHub](https://github.com/kkt-yu/RecycleViewTest)にある。
![Swipe.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476234/4bab2d8c-7940-20e6-ca14-8dac75d9d044.gif)

## 前準備(RecyclerViewを書く)
だいたいこの辺の処理。

```Kotlin
val recyclerView = recycler_list

dataList = createDataList()

val adapter = ViewAdapter(dataList, object : ViewAdapter.ListListener {
    override fun onClickRow(tappedView: View, rowModel: RowModel) {
        Toast.makeText(applicationContext, rowModel.title, Toast.LENGTH_LONG).show()
    }
})

recyclerView.setHasFixedSize(true)
recyclerView.layoutManager =
    androidx.recyclerview.widget.LinearLayoutManager(applicationContext)
recyclerView.adapter = adapter
```

createDataList()関数でデータを詰めてるのでそこは各自でいい感じに。

## 本題(スワイプの処理を書く)
スワイプした時の動作とかを書く。

```Kotlin
private fun getSwipeToDismissTouchHelper(adapter: RecyclerView.Adapter<HomeViewHolder>) =
    ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(
        ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT,
        ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
    ) {
        override fun onMove(
            recyclerView: RecyclerView,
            viewHolder: RecyclerView.ViewHolder,
            target: RecyclerView.ViewHolder
        ): Boolean {
            return false
        }

        //スワイプ時に実行
        override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
            //データリストからスワイプしたデータを削除
            dataList.removeAt(viewHolder.adapterPosition)

            //リストからスワイプしたカードを削除
            adapter.notifyItemRemoved(viewHolder.adapterPosition)
        }

        //スワイプした時の背景を設定
        override fun onChildDraw(
            c: Canvas,
            recyclerView: RecyclerView,
            viewHolder: RecyclerView.ViewHolder,
            dX: Float,
            dY: Float,
            actionState: Int,
            isCurrentlyActive: Boolean
        ) {
            super.onChildDraw(
                c,
                recyclerView,
                viewHolder,
                dX,
                dY,
                actionState,
                isCurrentlyActive
            )
            val itemView = viewHolder.itemView
            val background = ColorDrawable()
            background.color = Color.parseColor("#f44336")
            if (dX < 0)
                background.setBounds(
                    itemView.right + dX.toInt(),
                    itemView.top,
                    itemView.right,
                    itemView.bottom
                )
            else
                background.setBounds(
                    itemView.left,
                    itemView.top,
                    itemView.left + dX.toInt(),
                    itemView.bottom
                )

            background.draw(c)
        }
    })
```

コメントの通りだけど、一応解説すると

- onSwiped()<br>
スワイプした時の具体的な動作(ここではアイテムを削除する)を書く
- onChildDraw()<br>
スワイプした時の背景(ここでは赤色)を指定

## RecyclerViewに適用する
さっき作ったメソッドでItemTouchHelperをインスタンス化してそれにRecyclewViewをアタッチして終わり。

```Kotlin
val swipeToDismissTouchHelper = getSwipeToDismissTouchHelper(adapter)
swipeToDismissTouchHelper.attachToRecyclerView(recyclerView)
```

## おわり
実際はonSwipe()にどういう処理を書くかとか、onChildDraw()でどんなかっこいい見た目にするかとかが大事。