안드로이드의 리사이클러뷰에서 스와이프 이벤트를 하는 방법 중 ItemTouchHelper.callback()을 이용할 수 있습니다.
리사이클러뷰에서 스와이프나 드래그등 동작을지원해 해당 동작들을 허용하거나 막을 수 있으며 해당 동작을 했을 때 어떤 이벤트를 발생시킬 것인지 관리할 수 있습니다.
사용법
//적용
//....
userListItemHelper.attachToRecyclerView(recyclerView)//리사이클러뷰와 연결 연결
//구현
class UserListItemHelper(private val requsetPermission:(pos:Int)->(Unit)) : ItemTouchHelper.Callback() {
companion object{
private const val TAG = "UserListItemHelper"
}
override fun getMovementFlags(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
): Int {
return makeMovementFlags(0, ItemTouchHelper.RIGHT)
}//활성화된 이동 방향을 정의하는 플래그를 반환하는 메소드
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder,
): Boolean {
return false
}//드래그된 item을 이전 위치에서 새로운 위치로 옮길 때 호출
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
if (viewHolder is UserRecyclerViewAdapter.CustomViewHolder) {
if (viewHolder.mUser == null) return
requsetPermission(viewHolder.adapterPosition)
}
}//사용자에 의해 swipe될 때 호출
override fun isItemViewSwipeEnabled(): Boolean {
return true
}//Swipe 허용 유무
override fun isLongPressDragEnabled(): Boolean {
return false
}//LongPress시 Drag 허용 유무
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)
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE && viewHolder is UserRecyclerViewAdapter.CustomViewHolder){
val view = viewHolder.swipeView
getDefaultUIUtil().onDraw(c, recyclerView, view, dX, dY, actionState, isCurrentlyActive)
}
}//item 전체가 스와이되거나 드래그 되지않게 하기위해서 호출
override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
Log.d(TAG, "clearView: ")
getDefaultUIUtil().clearView((viewHolder as UserRecyclerViewAdapter.CustomViewHolder).swipeView)
}//drag 된 view 가 drop 되었거나 swipe 가 cancel 되거나 complete 되었을 때 불린다.
}
'안드로이드 > 안드로이드' 카테고리의 다른 글
[Android/Kotlin] DialogFragment 크기조절 (0) | 2023.09.13 |
---|---|
[Android/Kotlin] 퍼미션(권한)허용 (0) | 2023.09.12 |
[Android/Kotlin] attachToParent (0) | 2023.09.05 |
[Android/Kotlin] 프래그먼트안 프래그먼트에서 뒤로가기 (0) | 2023.09.04 |
[Android/Kotlin] 알림(Notification) - 1, NotificationChannel 속성 (2) | 2023.09.01 |