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)
}
我一直在学习 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)
}