[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
)
}
}
}
}