3 回答
TA贡献1795条经验 获得超7个赞
您需要为正在使用的项目定义视图类型。
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的viewholder进行回收,可以看到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])
}
}
TA贡献1951条经验 获得超3个赞
我认为您需要在回收站视图中创建一个回收站视图。您只需要创建包含 Medicine No 和另一个回收者视图的父回收者视图的项目布局文件。然后,您需要为包含可变数量药物的内部回收站视图创建项目布局文件。这回答了您的第 2 部分。
TA贡献1829条经验 获得超4个赞
RecyclerView::Adapter 有一个方法 getItemViewType(position),你可以覆盖它并返回不同的视图类型。在 createViewHolder(viewType) 中,您可以根据视图类型创建不同的视图。
添加回答
举报