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) 中,您可以根據視圖類型創建不同的視圖。
添加回答
舉報