Kotlin中RecyclerView多ViewHolder复用相同方法的Clean Code实践问询
多类型ViewHolder公共逻辑复用的Clean Code实现方案
方案1:中间层抽象基类(优先推荐)
你完全可以在RecyclerView.ViewHolder和你的具体业务ViewHolder之间加一层抽象基类,把所有公共逻辑收拢到基类中,不需要直接修改原生ViewHolder的实现:
// 抽象中间基类,继承原生ViewHolder abstract class BaseViewHolder(binding: ViewBinding) : RecyclerView.ViewHolder(binding.root) { // 所有公共方法统一在这里实现 fun someMethod() { // 公共逻辑 } fun otherCommonMethod(param: Int) { // 其他公共逻辑 } } // 业务ViewHolder只需要继承BaseViewHolder即可 private inner class ViewHolder1(binding: ViewBinding) : BaseViewHolder(binding) { // 仅需实现ViewHolder1独有的逻辑 } private inner class ViewHolder2(binding: View2Binding) : BaseViewHolder(binding) { // 仅需实现ViewHolder2独有的逻辑 }
该方案的优势是逻辑内聚性强,符合面向对象的继承语义,不会污染适配器的作用域,还支持子类重写公共方法的默认实现,适合公共逻辑和ViewHolder自身属性强相关、复用性高的场景。
方案2:带默认实现的接口(适用于存在多继承限制的场景)
如果部分业务ViewHolder已经继承了其他自定义的ViewHolder类,无法再继承BaseViewHolder,可以用带默认实现的接口做混入:
// 定义公共能力接口,Kotlin支持接口内带方法默认实现 interface ViewHolderCommonAbility { fun RecyclerView.ViewHolder.someMethod() { // 可以直接调用ViewHolder的公开属性(比如itemView)实现公共逻辑 } fun RecyclerView.ViewHolder.otherCommonMethod(param: Int) { // 公共逻辑实现 } } // 业务ViewHolder仅需实现该空接口即可获得所有公共能力 private inner class ViewHolder1(binding: ViewBinding) : RecyclerView.ViewHolder(binding.root), ViewHolderCommonAbility {} private inner class ViewHolder2(binding: View2Binding) : RecyclerView.ViewHolder(binding.root), ViewHolderCommonAbility {}
方案3:Kotlin扩展函数(适用于轻量逻辑、不想改动现有结构的场景)
如果公共逻辑不需要访问ViewHolder的私有属性,且你不想改动现有ViewHolder的继承/实现结构,可以直接写扩展函数:
// 可以写在适配器内部,仅对当前适配器的ViewHolder生效,不会污染全局作用域 fun RecyclerView.ViewHolder.someMethod() { // 公共逻辑实现 }
该方案成本最低,不需要修改现有ViewHolder的定义,写完即可直接在所有ViewHolder实例上调用。
关于适配器全局方法的说明
把公共方法提到适配器全局的方案仅适用于逻辑本身强依赖适配器属性(比如需要访问数据集、适配器注入的回调实例)的场景。如果逻辑是ViewHolder自身的视图行为,不建议放到适配器全局,会导致适配器职责过重,代码越来越臃肿。
内容的提问来源于stack exchange,提问作者misfit
相关产品推荐
相关产品推荐

