[Android/Kotlin] High Order Function을 사용한 onClick 리팩토링

High Order Function

High-Order-Function(고차함수)는 한 마디로 표현하면 다른 함수를 매개변수로 받거나 함수를 반환하는 함수를 말한다. 이를 통해 코드의 재사용성과 추상화 수준을 높일 수 있다.

설명 추가 예정

기존의 interface를 이용한 방식에서 변경 예시

TodoListAdapter

  • 기존 interface 방식 (Adapter)
class TodoListAdapter(private val itemClick: OnItemClick) :
    RecyclerView.Adapter<TodoListAdapter.ViewHolder>() {
      
    interface OnItemClick{
        fun onItemClick(view: View, item: TodoModel, position: Int)
    } 
      
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = list[position]
        holder.bind(item)

        holder.itemView.setOnClickListener {
            itemClick.onItemClick(it,item,position)
        }
    }  
}
  • 기존 interface 방식 (받아오는 부분)
private val itemClick = object : TodoListAdapter.OnItemClick {
    override fun onItemClick(view: View, item: TodoModel, position: Int) {
        
    }
}
  • 람다식을 활용한 개선된 방식
listViewItem.XML의 layout에 ID값 추가

Ex)

<androidx.constraintlayout.widget.ConstraintLayout 
    android:id="@+id/container"/>
Adapter
class TodoListAdapter(private val onClickItem: (Int, TodoModel) -> Unit) : 		
		RecyclerView.Adapter<TodoListAdapter.ViewHolder>() {
    
      
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(
            TodoItemBinding.inflate(LayoutInflater.from(parent.context), parent, false),
            onClickItem //받아주기
        )
    }  
      
		class ViewHolder(
        private val binding: TodoItemBinding,
        private val onClickItem: (Int, TodoModel) -> Unit
    ) : RecyclerView.ViewHolder(binding.root) {
        fun bind(item: TodoModel) = with(binding) {
            container.setOnClickListener { //item setOnClickListener구현
                onClickItem(
                    adapterPosition,
                    item
                )
            }
        }
    }    
}

© 2023. All rights reserved.

by SoftyChoo