마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Recycler diffUtil ViewHolder를 여러개로 나누고싶어요....

0 추천

가장 간단한 List<String>을 받아서 리스트뷰에 뿌려주는 코드입니다

class Adapter : ListAdapter<String, Adapter.ViewHolder>(diffUtil) {

    inner class ViewHolder(private val binding: AdapterItemBinding) : RecyclerView.ViewHolder(binding.root) {

        fun bind(str: String) {
            binding.item.text = str
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(AdapterItemBinding.inflate(LayoutInflater.from(parent.context), parent, false))
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(currentList[position])
    }

    companion object {
        val diffUtil = object : DiffUtil.ItemCallback<String>() {
            override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
                return oldItem == newItem
            }

            override fun areContentsTheSame(oldItem: String, newItem: String): Boolean {
                return oldItem == newItem
            }
        }
    }
}

ViewHolder -> bind() 부분을 

AViewHolder는 binding.item.text=str + 1

BViewHolder는 binding.item.text=str + 2

CViewHolder는 binding.item.text=str + 3

이렇게 나누고 나머지 코드는 재사용해서 사용하고 싶은데 

방법을 도저히 모르겠습니다....

dkssudgktpdy (520 포인트) 님이 2022년 4월 28일 질문
질문을 좀 더 명확하게 해보시겠어요? 멀티뷰타입을 사용하고 싶으신 건지, 아니면 다른 의도이신건지 헷갈리네요.

2개의 답변

+1 추천
 
채택된 답변

뷰홀더를 다르게 사용하시려면 어떤 아이템이 어떤 뷰홀더를 사용한다는 매핑정보가 필요합니다.  따라서 맵핑 정보를 제공할 클래스를 만들어 해결할 수 있습니다.

sealed clsss StringItem {
    abstract val str: String
    abstract fun bind(binding: AdapterItemBinding)

    data class A(override val str: String) : StringItem {
        override fun bind(binding: AdapterItemBinding) {
            binding.item.text = str + 1
        }
    }

    data class B(override val str: String) : StringItem {
        override fun bind(binding: AdapterItemBinding) {
            binding.item.text = str + 2
        }
    }

    data class C(override val str: String) : StringItem {
        override fun bind(binding: AdapterItemBinding) {
            binding.item.text = str + 3
        }
    }
}

class Adapter : ListAdapter<StringItem, Adapter.ViewHolder>(diffUtil) {

    inner class ViewHolder(private val binding: AdapterItemBinding) : RecyclerView.ViewHolder(binding.root) {
        fun bind(item: StringItem) {
            item.bind(binding)
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(AdapterItemBinding.inflate(LayoutInflater.from(parent.context), parent, false))
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(getItem(position))
    }

    companion object {
        val diffUtil = object : DiffUtil.ItemCallback<StringItem>() {
            override fun areItemsTheSame(oldItem: StringItem, newItem: StringItem): Boolean {
                return oldItem == newItem
            }

            override fun areContentsTheSame(oldItem: StringItem, newItem: StringItem): Boolean {
                return oldItem == newItem
            }
        }
    }
}


val stringItems = listOf(
    ListItem.A("aaaa"),
    ListItem.B("bbbb"),
    ListItem.C("cccc"),
)

adapter.submitList(stringItems)

 

spark (227,470 포인트) 님이 2022년 4월 28일 답변
dkssudgktpdy님이 2022년 4월 28일 채택됨
0 추천
inner class AViewHolder(private val binding: AdapterItemBinding) : RecyclerView.ViewHolder(binding.root) {

        fun bind(str: String) {
            binding.item.text = str +1
        }
    }
inner class BViewHolder(private val binding: AdapterItemBinding) : RecyclerView.ViewHolder(binding.root) {

        fun bind(str: String) {
            binding.item.text = str +2
        }
    }
inner class CViewHolder(private val binding: AdapterItemBinding) : RecyclerView.ViewHolder(binding.root) {

        fun bind(str: String) {
            binding.item.text = str +3
        }
    }

이렇게 VIewHolder만 갈아끼우고 싶습니다 

다른 Adapter 코드는 그대로 사용하고

익명사용자 님이 2022년 4월 28일 답변
...