您需要为您正在使用的项目定义视图类型。
data class MedicineItem(val name, val imageUrl, val viewType)
然后将列表传递给您的适配器
覆盖适配器中的 getViewItemType() 方法。作为设计,我认为您将需要三种类型的医学项目视图。第一个是标题,第二个是普通项目,第三个是带有图像的医学项目。
可以自己定义viewType的值,比如我刚做的
class Constants {
const val TITLE = 1
const val NORMAL_ITEM = 2
const val IMAGE_ITEM = 3
}
override fun getItemViewType(position: Int): Int {
val item : MedicineItem = list[position]
if(item.viewType == Constants.TITLE)
return Constants.TITLE
else if(item.viewType == Constant.NORMAL_ITEM)
return Constants.NORMAL_ITEM
else if(item.viewType == Constant.NORMAL_ITEM)
return Constants.IMAGE_ITEM
}
对于每个视图项的不同布局,您需要为每种类型创建三个布局(xml 文件)和三个 ViewHolder 类。然后定义要显示的布局。
首先,在 onCreatViewHolder() 中,决定哪个 ViewHolder 将用于每个视图项。可以看到viewType的返回值。
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder {
if(viewType == Constants.TITLE) {
return MedicineTitleViewHolder()
} else if(viewType == Constants.NORMAL_ITEM) {
return MedicineNormalViewHolder()
} else if(viewType == Constants.IMAGE_ITEM) {
return MedicineIamgeViewHolder()
}
}
最后,现在在onBindViewHolder()中返回每个item的视图持有者进行回收,你可以看到bind()方法接收到单个数据,你可以传递一个MedicinItem数据对象来显示。
override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) {
if (holder is MedicineTitleViewHolder) {
(holder as MedicineTitleViewHolder).bind(list[position])
} else if(holder as MedicineNormalViewHolder){
(holder as MedicineNormalViewHolder).bind(list[position])
} else if(viewType == Constants.IMAGE_ITEM) {
(holder as MedicineIamgeViewHolder).bind(list[position])
}
}