我正在尝试实现一个通用的RV适配器,主要是受THIS COMMENT的启发:
代码:
class RVAdapter <T: Any, VB: ViewBinding>(
private var dataSet: List<T>,
private val bindingInterface: RVBinding<T, VB>
) : ListAdapter<T, RVAdapter<T, VB>.RVHolder>(DiffCallback<T>()) {
inner class RVHolder(private val binding: ViewBinding): RecyclerView.ViewHolder(binding.root) {
fun<T: Any, VB: ViewBinding> bind(item: T, bindingInterface: RVBinding<T, VB>) {
bindingInterface.bind(item, (binding as VB)) //3: unchecked cast
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RVHolder {
val binding = (VB as ViewBinding).inflate() //1: how do you inflate from generic VB?
return RVHolder(binding)
}
override fun onBindViewHolder(holder: RVHolder, position: Int) {
holder.bind(getItem(position), bindingInterface)
}
override fun getItemCount() = dataSet.size
}
private class DiffCallback<T: Any>: DiffUtil.ItemCallback<T>() {
//2: how do you implement the following two methods?
override fun areItemsTheSame(oldItem: T, newItem: T): Boolean {
TODO("Not yet implemented")
}
override fun areContentsTheSame(oldItem: T, newItem: T): Boolean {
return oldItem == newItem
}
}
interface RVBinding<T: Any, VB: ViewBinding> {
fun bind(item: T, binding: VB)
}
我面临两个主要问题:
1.如何在onCreateViewHolder()
中扩展绑定?通常,我使用SpecificBinding.inflate()
,但这似乎不适用于通用视图绑定。
1.我如何以通用的方式实现DiffUtil
部分?当然,我可以比较old.toString == new.toString
,但那不是通用的。而且oldItem == newItem
没有实现equals()
。
那么,我如何解决这些问题,使适配器尽可能通用呢?任何其他建议都是受欢迎的。
1条答案
按热度按时间a11xaf1n1#
例如,您可以使用下面的通用结构。
GenericDiffUtil.kt