我也面临同样的问题。在将 Java POJO 重写为数据类时,我面临 Kotlin 数据类的受限继承问题,以便在具有多个 ViewHolder 的单个 PageListAdapter 的多个数据类型中使用。但是在 Kotlin 1.1 版之后,我们可以开始将接口实现为继承。但是使用这种模式,我们还必须使用关键字'as'对数据类和视图模型进行显式转换。结合@Anthony Cannon 对通用类 T 的回答,我可以让它工作。但我仍然不知道 IDE 在使用 Generic RecyclerView.ViewHolder 时显示错误并需要显式转换的原因。
下面是我的代码。
没有任何内容的空界面 - 超级
界面超级
数据类 TypeA 实现 Abstract
data class TypeA (val someValueA: someValueA): Super
数据类 TypeB 实现抽象
data class TypeB (val someValueB: someValueB): Super
PagedListAdapter 用于处理多个 Data Class 和多个 ViewHolder
class CustomPagedListAdapterV2<T : Super, VH : RecyclerView.ViewHolder> internal constructor(private var controller: Controller) :
CustomPagedListAdapterV2<T , VH>(object : DiffUtil.ItemCallback<T>() {
override fun areItemsTheSame(oldItem: T, newItem: T): Boolean {
return false
}
override fun areContentsTheSame(oldItem: T, newItem: T): Boolean {
// TODO :
return false
}
}) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH {
val itemView = LayoutInflater.from(parent.context).inflate(R.layout.layout_adapter_type_a, parent, false) // return TypeBListViewHolder(itemView, controller) as VH //depend on your own implementation
return TypeAListViewHolder(itemView, controller) as VH
}
override fun onBindViewHolder(holder: VH, position: Int) { // (holder as TypeAListViewHolder).bindModel(getItem(position) as TypeB) //depend on your own implementation
(holder as TypeAListViewHolder).bindModel(getItem(position) as TypeA)
}
}
从 Fragment/Activity 的 ViewModel 初始化 PagedListAdapter
private lateinit var mAdapter: CustomPagedListAdapterV2<Super, RecyclerView.ViewHolder>
viewModel.liveData.observe(viewLifecycleOwner, Observer { t ->
mAdapter.submitList(t as PagedList<Super>)
})
说明