【发布时间】:2019-07-12 15:15:18
【问题描述】:
我正在尝试使用通用基本视图持有者在回收者视图中实现多种视图类型。
BaseViewHolder 类是
abstract class BaseViewHolder<T>(itemView: View) : RecyclerView.ViewHolder(itemView) {
abstract fun bind(item: T)
}
然后我为特定的视图类型创建了一个视图持有者类
inner class CarouselViewHolder(itemView: View) : BaseViewHolder<HomeCarousel>(itemView) {
override fun bind(item: HomeCarousel) {
}
}
从有趣的 onBindViewHolder 方法访问此绑定函数时出现错误。
外投影类型'BaseViewHolder'禁止使用'public abstract fun bind(item:T):
override fun onBindViewHolder(holder: BaseViewHolder<*>, position: Int) {
val element = data[position]
when (element) {
is HomeCarousel -> {
holder.bind(element)
}
else -> throw java.lang.IllegalArgumentException("Invalid binding")
}
}
遇到错误
holder.bind(element)
这是我的整个适配器类
class HomePageRecylerAdapter(private val data: ArrayList<Any>) : RecyclerView.Adapter<BaseViewHolder<*>>() {
companion object {
const val typeCarousel = 0
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<*> {
return when (viewType) {
typeCarousel -> {
val view =
LayoutInflater.from(parent.context).inflate(R.layout.recycler_item_home_carasoul, parent, false)
CarouselViewHolder(view)
}
else -> throw IllegalArgumentException("Invalid view type")
}
}
override fun getItemCount() = data.size
override fun onBindViewHolder(holder: BaseViewHolder<*>, position: Int) {
val element = data[position]
when (element) {
is HomeCarousel -> {
holder.bind(element)
}
else -> IllegalArgumentException("Invalid binding")
}
}
override fun getItemViewType(position: Int): Int {
val element = data[position]
return when (element) {
is HomeCarousel -> typeCarousel
else -> throw IllegalArgumentException("Invalid type of data {$position}")
}
}
inner class CarouselViewHolder(itemView: View) : BaseViewHolder<HomeCarousel>(itemView) {
override fun bind(item: HomeCarousel) {
}
}
}
abstract class BaseViewHolder<T>(itemView: View) :
RecyclerView.ViewHolder(itemView) {
abstract fun bind(item: T)
}
【问题讨论】:
标签: android kotlin android-recyclerview