PagedListAdapter中的通用列表

时间:2018-01-17 16:34:03

标签: android kotlin generic-collections android-architecture-components

我想将通用类用作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)

因为类型投影

中不接受outin修饰符
PagedListAdapter<in/out GenericInterface, ..>(..){...}

有没有解决方法呢?

3 个答案:

答案 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