ListAdapter 没有类型参数 - 如何在 AndroidX 中创建单独的 ViewHolder 文件?

No type argument expected for ListAdapter - How to create separated ViewHolder files in AndroidX?

我一直在学习 AndroidX,我想在我自己的 Adapter class 中创建一个非嵌套 ViewHolder。到目前为止,我正在做类似

的事情

MainAdapter.kt

class MainAdapter : ListAdapter<MainResponse, MainAdapter.MainViewHolder>(MainDiffCallback()) {

  //onCreate
  //onBind
  //...

  class MainViewHolder(
        private val binding: ListItemMainBinding
    ) : RecyclerView.ViewHolder(binding.root) {

        fun bind(listener: View.OnClickListener) {
            with(binding) {
                this.listener = listener
            }
        }
    }
}

现在我想将它们创建为单独的文件,例如

MainAdapter.kt

class MainAdapter : ListAdapter<MyObject, MainViewHolder>(MainDiffCallback()) {
  //onCreate
  //onBind
  //...
}

MainViewHolder.kt

class MainViewHolder(private val binding: ListItemMainBinding): RecyclerView.ViewHolder(binding.root) {

    fun bind(listener: View.OnClickListener, manufacturer: String, color: Int) {
        with(binding) {
            binding.listener = listener
        }
    }
}

使用不同的文件,我不确定这将如何在 MainAdapter 上声明。这 class MainAdapter : ListAdapter<MainResponse, MainViewHolder> returns 我是一个非编译错误 No type argument expected for ListAdapter。解决此问题的正确语法或方法是什么?

确保您使用的是正确的回收站视图ListAdapter

import androidx.recyclerview.widget.ListAdapter

而不是这个:

import android.widget.ListAdapter  // This does not have type argument

代码应保持如下:

MainAdapter.kt

class MainAdapter : ListAdapter<MainResponse, MainViewHolder>(MainDiffCallback()) {

}

MainDiffCallback.kt

class MainDiffCallback : DiffUtil.ItemCallback<MainResponse>() {

    override fun areItemsTheSame(
        oldItem: MainResponse,
        newItem: MainResponse
    ): Boolean {
        return oldItem == newItem
    }

    override fun areContentsTheSame(
        oldItem: MainResponse,
        newItem: MainResponse
    ): Boolean {
        return oldItem.image == newItem.image
    }
}

MainViewHolder.kt

class MainViewHolder(private val bind: ListItemMainBinding) : BaseViewHolder<View.OnClickListener>(bind) {

    override fun onBind(listener: View.OnClickListener) {
        bind.listener = listener
    }
}

也借此机会补充一个摘要BaseViewHolder

BaseViewHolder.kt

abstract class BaseViewHolder<T>(bind :
                                         ViewDataBinding
) : RecyclerView.ViewHolder(bind.root) {

    abstract fun onBind(data: T)
}