使用RecycleView的多视图-Kotlin(Android)-无法切换viewholder
我已经浏览了好几天,想找到解决我问题的方法,但我被难住了,无法找出问题的答案。我是Android/Kotlin的相对初学者,所以请容忍我 我有一个如下所示的数据类,我从静态源填充pid值等 类MyOrderList(变量pid:String,变量名称:String,变量imageUrl:String,变量大小:String,变量描述:String,变量价格:Int,变量计数:Int,变量itemtotal:Int) 其基本思想是,如果您遍历上述类列表,pid通常由一个数字或一个特定的词表示,例如“LIQUID”。所以在我的列表中,位置0将显示pid=“LIQUID”,位置1是一个数字,表示pid=2 我想创建一个recyclerview,当它在列表中将LIQUID视为pid时,它将使用viewholder2和自己的布局。否则,它将在自己的布局中使用viewholder1 问题是,我创建的recyclerview只显示一个viewholder。如果位置0 pid为液体,则viewholder为ViewHolder2,即使对于pid不再为液体的列表中的后续项目也是如此。简而言之,位置0上的pid值将指示整个列表的viewholder 我仍在试图找出RecyclerView的曲折之处,但仍然没有完全理解它 请参阅下面的代码片段 ===================== 类MyOrderCart(变量myOrder:MutableList,变量mymutablelist:MutableList): RecyclerView.Adapter(){使用RecycleView的多视图-Kotlin(Android)-无法切换viewholder,android,kotlin,android-recyclerview,multiview,Android,Kotlin,Android Recyclerview,Multiview,我已经浏览了好几天,想找到解决我问题的方法,但我被难住了,无法找出问题的答案。我是Android/Kotlin的相对初学者,所以请容忍我 我有一个如下所示的数据类,我从静态源填充pid值等 类MyOrderList(变量pid:String,变量名称:String,变量imageUrl:String,变量大小:String,变量描述:String,变量价格:Int,变量计数:Int,变量itemtotal:Int) 其基本思想是,如果您遍历上述类列表,pid通常由一个数字或一个特定的词表示,例如
嘿,您还没有重写getItemViewType方法。请尝试以下代码
override fun getItemViewType(position: Int): Int {
return myOrder.get(position).pid
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
"LIQUOR" -> {
ViewHolder2(
LayoutInflater.from(parent.context)
.inflate(R.layout.insidecheckout_label, parent, false)
)
}
"NOODLES" -> {
ViewHolder2(
LayoutInflater.from(parent.context)
.inflate(R.layout.insidecheckout_label, parent, false)
)
}
else -> {
ViewHolder1(
LayoutInflater.from(parent.context)
.inflate(R.layout.layout_insidecheckout, parent, false)
)
}
}
}
由于您没有使用getItemViewType发送viewType,因此在onCreateViewHolder中始终会获得0。在适配器类中,您需要重写
getItemViewType
方法。
像这样:
override fun getItemViewType(position: Int): Int {
// return view type according to position
// get your pid using position
// return 0 for "LIQUOR", 1 for "NOODLES" and 2 for anything else
// you have to return an integer value only, according to the method signature
}
然后,在onCreateViewHolder
方法中,使用类型为int的viewType参数对所需视图进行充气:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
0 -> {
ViewHolder2(
LayoutInflater.from(parent.context)
.inflate(R.layout.insidecheckout_label, parent, false)
)
}
1 -> {
ViewHolder2(
LayoutInflater.from(parent.context)
.inflate(R.layout.insidecheckout_label, parent, false)
)
}
else -> {
ViewHolder1(
LayoutInflater.from(parent.context)
.inflate(R.layout.layout_insidecheckout, parent, false)
)
}
}
}谢谢。getItemViewType需要Int作为返回类型。但你的意见对我帮助很大。谢谢pid不是一个整型变量吗?嗨,Vansh。你的推荐有效!!!我执行了以下操作,并修改了oncreateviewholder以预测viewtype值。重写fun getItemViewType(position:Int):Int{var mycartlist:MyOrderList=myOrder.get(position)when(mycartlist.pid){“酒”->{return 1}“面条”->{return 2}else->{return 0}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
0 -> {
ViewHolder2(
LayoutInflater.from(parent.context)
.inflate(R.layout.insidecheckout_label, parent, false)
)
}
1 -> {
ViewHolder2(
LayoutInflater.from(parent.context)
.inflate(R.layout.insidecheckout_label, parent, false)
)
}
else -> {
ViewHolder1(
LayoutInflater.from(parent.context)
.inflate(R.layout.layout_insidecheckout, parent, false)
)
}
}