完成イメージ
RecyclerViewのアイテムをスワイプするとそのアイテムを削除できる。
完成品はこちらのGitHubにある。
前準備(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()でどんなかっこいい見た目にするかとかが大事。