9
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-08-03

完成イメージ

RecyclerViewのアイテムをスワイプするとそのアイテムを削除できる。
完成品はこちらのGitHubにある。
Swipe.gif

前準備(RecyclerViewを書く)

だいたいこの辺の処理。

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()関数でデータを詰めてるのでそこは各自でいい感じに。

本題(スワイプの処理を書く)

スワイプした時の動作とかを書く。

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()

    スワイプした時の具体的な動作(ここではアイテムを削除する)を書く
  • onChildDraw()

    スワイプした時の背景(ここでは赤色)を指定

RecyclerViewに適用する

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

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

おわり

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

9
12
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
9
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?