리사이클러뷰 멀티 뷰 타입이란 여러 개의 뷰 타입, 즉 리사이클러뷰 내에서 한 개의 뷰 형태만을 랜더링 하는 게 아니라 다수의 뷰 형태를 가지는 객체들을 랜더링하는 방법입니다. 리사이클러뷰를 사용해 뷰를 생성하면 일반적으로는 가로, 혹은 세로로 나열되지만, 각기 다른 아이템을 한 화면에서 보여주고 싶다면 멀티 뷰 타입을 사용하면 됩니다.
companion object {
const val VIEW_TYPE_LEFT = 0
const val VIEW_TYPE_RIGHT = 1
}
inner class LeftViewHolder(private val binding: ListViewLeftBinding) : RecyclerView.ViewHolder(binding.root) {
private val profileImage = binding.profileImage
private val listName = binding.listName
private val groupName = binding.groupName
private val favoritButton = binding.favoritButton
fun bindLeft(item: ContactItem) {
profileImage.setImageResource(item.profileImage)
listName.text = item.listName
groupName.text = item.groupName
if (item.isFavorite) {
favoritButton.setImageResource(R.drawable.ic_love_filled)
} else {
favoritButton.setImageResource(R.drawable.ic_love_empty)
}
}
}
inner class RightViewHolder(private val binding: ListViewRightBinding) : RecyclerView.ViewHolder(binding.root) {
private val profileImage = binding.profileImage
private val listName = binding.listName
private val groupName = binding.groupName
private val favoritButton = binding.favoritButton
fun bindRight(item: ContactItem) {
profileImage.setImageResource(item.profileImage)
listName.text = item.listName
groupName.text = item.groupName
if (item.isFavorite) {
favoritButton.setImageResource(R.drawable.ic_love_filled)
} else {
favoritButton.setImageResource(R.drawable.ic_love_empty)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(parent.context)
return when (viewType) {
VIEW_TYPE_LEFT -> {
val binding = ListViewLeftBinding.inflate(inflater, parent, false)
LeftViewHolder(binding)
}
VIEW_TYPE_RIGHT -> {
val binding = ListViewRightBinding.inflate(inflater, parent, false)
RightViewHolder(binding)
}
else -> throw IllegalArgumentException("Invalid view type")
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val item = items[position]
when (holder) {
is LeftViewHolder -> holder.bindLeft(item)
is RightViewHolder -> holder.bindRight(item)
}
}
override fun getItemViewType(position: Int): Int {
return if (position % 2 == 0) {
VIEW_TYPE_LEFT
} else {
VIEW_TYPE_RIGHT
}
}
override fun getItemCount(): Int {
return items.size
}