본문 바로가기
Develop/Android

kotlin custom listener 이용하기

by 라이프레이서 2020. 5. 6.

목차

    반응형

    Index

    최근 안드로이드 프로젝트 개발하던 도중 RecyclerView의 item을 클릭했을 때 Dialog가 뜨고, 동작에 따라 해당 item의 데이터를 activity의 생명주기에 맞게 처리를 해야하는 일이 있었다.
    이 과정에서 알게 된 custom listener를 생성하고 사용하는 방법에 대해 포스팅하고자 한다.

    (포스팅 내용중 android Room, android coroutine을 다루는 부분은 이전 포스팅들에서 확인할 수 있다.)

    https://chjune0205.tistory.com/78 룸

     

    android Room 사용하기

    0.Intro android Room 을 사용하는 방법에 대해 알아보자 android Room은 SQLite, Realm과 같은 로컬 데이터베이스로서 원활한 데이터베이스 접근을 가능케 하는 라이브러리이다. 현재 안드로이드 개발자 페이지에..

    chjune0205.tistory.com

    https://chjune0205.tistory.com/80 코루틴

     

    코틀린 코루틴 개념 알아보기(Kotlin coroutine)

    0. 코루틴이란? 코루틴 (coroutine) : 루틴의 일종으로서, 협동(co)루틴 이라고 할 수 있다. 두 루틴 이상이 서로 대등한 관계에 있으며, 서로가 서로를 호출하는 방식으로 작동한다. 어떠한 코루틴이

    chjune0205.tistory.com

    https://chjune0205.tistory.com/82 라이브데이터

     

    Android Room에 코루틴과 LiveData 적용해보기

    0. 개요 최근 프로젝트를 진행하며 Android Room을 이용해보기 위해 공부한 내용을 포스팅 하려 한다. Android Room과 관련한 포스팅은 아래 링크를 참고하면 좋을 것 같다. https://chjune0205.tistory.com/78 an..

    chjune0205.tistory.com

    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의 데이터를 삭제하는 로직을 수행하도록 구현하였다.

    이렇게 설정해주면 정상적으로 데이터가 삭제되는 것을 볼 수 있다.

    반응형