notifyDatasetChanged()
를 호출해 RecyclerView 를 다시 그린다.ListAdapter
라는 wrapper 클래스를 활용해 더 간편하게 쓸 수 있다!기존 RecyclerView 구현 방법 중에 Adapter 만 다르다.
class CharacterListAdapter : ListAdapter<Profile, CharacterListAdapter.ViewHolder>(CharacterListDiffCallback) {
inner class ViewHolder(private val binding: CharacterItemViewBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(profile: Profile) {
binding.apply {
image.setImageResource(profile.image)
name.text = profile.name
favorite.text = profile.favorite
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = CharacterItemViewBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(getItem(position))
}
object CharacterListDiffCallback : DiffUtil.ItemCallback<Profile>() {
override fun areItemsTheSame(oldItem: Profile, newItem: Profile): Boolean {
return oldItem == newItem
}
override fun areContentsTheSame(oldItem: Profile, newItem: Profile): Boolean {
return oldItem.uuid == newItem.uuid
}
}
}
위쪽의 ViewHolder 나 onCreateViewHolder, onBindViewHolder 는 RecyclerView.Adapter 구현할 때와 똑같다.
⭐️핵심은⭐️
CharacterListDiffCallback 를 살펴보면,
areItemsTheSame() : 아이템이 서로 같은 데이터를 갖고있는지 확인한다.
areContentsTheSame() : 아이템의 내용이 같은지 확인한다.
클래스로 전달한다면 클래스 속성끼리 비교하는 것!
Profile 클래스에 고유 아이디 (UUID) 속성을 추가해 서로 구분되도록 해주었다.
RecyclerView 에 adapter 를 설정하는 방식은 똑같다.
LayoutManager 를 꼭꼭 잊지말고 설정해주자.. 오늘의 삽질 🥲