목차
Index
최근 안드로이드 프로젝트 개발하던 도중 RecyclerView의 item을 클릭했을 때 Dialog가 뜨고, 동작에 따라 해당 item의 데이터를 activity의 생명주기에 맞게 처리를 해야하는 일이 있었다.
이 과정에서 알게 된 custom listener를 생성하고 사용하는 방법에 대해 포스팅하고자 한다.
(포스팅 내용중 android Room, android coroutine을 다루는 부분은 이전 포스팅들에서 확인할 수 있다.)
https://chjune0205.tistory.com/78 룸
https://chjune0205.tistory.com/80 코루틴
https://chjune0205.tistory.com/82 라이브데이터
0. 전체 흐름
1. 다이얼로그에 listener부터 달아주기
필자가 만든 다이얼로그는 취소, 삭제 버튼이 있는 다이얼로그이다. 때문에 삭제 버튼에 대해 처리를 해 줄 필요가 있었는데, kotlin coroutine을 이용하기 위해 activity에서 처리해주어야 한다는 것을 생각했다.
때문에 삭제 처리에 대한 로직은 activity에서 선언해주고, 이 함수를 전달하는 방식이 좋겠다고 판단되었다.
우선 다이얼로그 내부에 다음 코드를 넣어주었다.
인터페이스 및 구현 함수이다.
fun setOnDeleteOKClickedListener(listener : (Int) -> Unit){//파라미터 1개를 가진 함수 라는 뜻
this.listener = object : DeleteDialogOKClickedListener{
override fun onOKClicked(habitIndex: Int) {
listener(habitIndex)
}
}
}
interface DeleteDialogOKClickedListener{
fun onOKClicked(habitIndex : Int)
}
이 부분을 작성하면서 kotlin은 함수를 인자로 전달할 수 있는 것을 알 수 있었다.
매개변수 부분에서 listner : (Int) -> Unit 이라는 것은 매개변수 하나만 가지고 있으며, 리턴 타입이 없는 함수라는 뜻.
2. viewHolder에 다이얼로그 띄우고, listener 구현 함수 전달해주기
val deleteHabitDialog = DeleteHabitDialog(activity,data)
deleteHabitDialog.show(sm,"delete")
deleteHabitDialog.setOnDeleteOKClickedListener {
deleteListener(it)
}
위 작업은 뷰홀더에서 다이얼로그를 띄우는 버튼을 클릭했을때 작업이다.
해당 뷰홀더 및 어댑터는 listener 함수를 생성자에서 전달해준다.
class EditHabitViewHolder(
itemView: View,
private val activity:Activity,
private val sm:FragmentManager,
private val deleteListener : (Int) -> Unit = {}
) : RecyclerView.ViewHolder(itemView){
...
}
class EditHabitAdapter(
private val activity: Activity,
private val sm : FragmentManager,
private val deleteListener : (Int) -> Unit = {}
) : RecyclerView.Adapter<EditHabitViewHolder>() {
...
}
3. 삭제 로직 구현하기 - activity
val deleteHabitFunction = fun (index : Int){
lifecycleScope.launch(Dispatchers.IO) {
db.habitDao().deleteHabitById(index)
}
}
이는 activity 내에서 전역 변수로 선언한 함수이다. 이 부분에서는 코루틴을 사용하여 Room의 데이터를 삭제하는 로직을 수행하도록 구현하였다.
이렇게 설정해주면 정상적으로 데이터가 삭제되는 것을 볼 수 있다.
'Develop > Android' 카테고리의 다른 글
Android Socket 실시간 통신 라이브러리 활용 (0) | 2020.06.14 |
---|---|
Android 함수를 매개변수로 전달 - kotlin (0) | 2020.05.16 |
Android Room에 코루틴과 LiveData 적용해보기 (0) | 2020.04.28 |
MPAndroidChart 라이브러리를 활용한 BarChart 그리기 (19) | 2020.04.26 |
코틀린 코루틴이란? (Kotlin coroutine) (0) | 2020.04.14 |