我想将通用类用作PagingList<>
interface GenericInterface{}
class GenericImplementation: GenericInterface{}
作为Kotlin doc状态:列表中的here继承是不可能的,虽然我可以声明 T 的参数的泛型类型
public abstract class PagedListAdapter<T, VH extends RecyclerView.ViewHolder>
喜欢
class MAdapter: PagedListAdapter<GenericInterface, MAdapter.ViewHolder>(DIFF_CALLBACK){...}
我无法将通用列表传递给它
mAdapter.setList(listOfGenericImplementation)
因为类型投影
中不接受out
,in
修饰符
PagedListAdapter<in/out GenericInterface, ..>(..){...}
有没有解决方法呢?
答案 0 :(得分:1)
好吧所以我遇到了同样的问题但除了这个问题之外找不到任何东西,但过了一段时间我想出来了,我做的方式是在你自己的类中定义泛型然后传递给它PagedListAdapter
,例如:
你会这样发起:
var adapter: MAdapter<GenericImplementation, MAdapter.ViewHolder>
然后你的适配器类看起来像这样:
class MAdapter<T : GenericInterface, VH : RecyclerView.ViewHolder> : PagedListAdapter<T, VH>(
object : DiffCallback<T>() {
override fun areItemsTheSame(oldItem: T, newItem: T): Boolean =
oldItem.id == newItem.id
override fun areContentsTheSame(oldItem: T, newItem: T): Boolean =
oldItem == newItem
}) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH =
MAdapter.ViewHolder(parent)
override fun onBindViewHolder(holder: VH, position: Int) {
holder.bindTo(getItem(position)!!)
}
}
正如您所看到的,DiffCallback
必须是内联的,而不是将其放入伴侣对象的规范。
答案 1 :(得分:0)
我也面临同样的问题。在将Java POJO重写为数据类时,我面临Kotlin数据类的继承受限制的问题,该继承只能在具有多个ViewHolder的单个PageListAdapter的多个数据类型中使用。但是在Kotlin 1.1版之后,我们可以开始将Interface实现为继承。但是使用这种模式,我们还需要使用关键字'as'对数据类和ViewModel进行显式强制转换。在通用类T上使用@Anthony Cannon答案进行合并,我就能使其正常工作。但是我仍然不知道为什么IDE在使用Generic RecyclerView.ViewHolder时显示错误并需要显式强制转换的原因。
下面是我的代码。
没有任何内容的空接口-超级 超级界面 实现摘要的数据类TypeA
data class TypeA (val someValueA: someValueA): Super
实现抽象的数据类TypeB
data class TypeB (val someValueB: someValueB): Super
用于处理多个数据类和多个ViewHolder的PagedListAdapter
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>)
})
说明
答案 2 :(得分:0)
abstract class DiffUtilPagedListAdapter<T : PagingComparable<T>, VH : BaseBindingViewHolder<T>> :
PagedListAdapter<T, VH>
适配器类将接受实现接口的类:PagingComparable,将在实现接口的类内部调用diff util方法。
适配器将非常短,如下所示
class TransactionAdapter :
DiffUtilPagedListAdapter<Transaction, TransactionAdapter.TransactionViewHolder>() {
class TransactionViewHolder(override val binding: ItemTransactionBinding) :
BaseBindingViewHolder<Transaction>(binding) {
override fun bind(data: Transaction) {
binding.transaction = data
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TransactionViewHolder {
return TransactionViewHolder(createBinding(R.layout.item_transaction, parent))
}}
具有分页,MVVM和数据绑定功能,可节省时间!
您可以阅读更多here