我已经浏览了几天以找到解决问题的方法,但是我很困惑,无法解决问题。我是Android / Kotlin的相对入门者,请耐心等待。
我有下面的数据类,并且从静态源填充了pid值等。
class MyOrderList(var pid:字符串,var名称:字符串,var imageUrl:字符串,var大小:字符串,var描述:字符串,val价格:Int,var count:Int,var itemtotal:Int)
想法基本上是,如果您遍历上面的类列表,则pid通常由数字或特定单词(例如“ LIQUID”)表示。因此,在我的列表中,位置0将显示pid =“ LIQUID”,位置1是一个数字,例如pid = 2。
我想创建一个recyclerview,当它在列表中看到LIQUID为pid时,它将使用viewholder2及其自己的布局。否则,它将使用viewholder1及其自己的布局。
问题是我创建的recyclerview仅显示一个视图持有者。如果位置0 pid为LIQUID,则即使对于列表中具有PID的后续项目,viewholder也为ViewHolder2,不再是LIQUID。简而言之,位置0上的pid将决定整个列表的观看者。
我仍在尝试弄清RecyclerView的曲折,但仍不完全了解。
请参见下面的代码段。
=====================
类MyOrderCart(var myOrder:MutableList,var mymutablelist:MutableList): RecyclerView.Adapter(){
inner class ViewHolder1(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bindView1(mycartlist: MyOrderList){
itemView.nameView.text = mycartlist.name
itemView.sizeView.text = "Size: ${mycartlist.size}"
var iprice = mycartlist.price
itemView.priceView.text = "Price: $iprice"
var icount = mycartlist.count
itemView.countView.text = "Count: $icount"
var itotal = mycartlist.itemtotal
itemView.itemtotalView.text = "Subtotal: $itotal"
var image_checkout = itemView.findViewById(R.id.image_checkout) as ImageView
var checkout_deletebutton = itemView.findViewById(R.id.checkout_deletebutton) as ImageButton
var checkout_editcount = itemView.findViewById(R.id.checkout_editcount) as ImageButton
var mytime = System.currentTimeMillis()
try {
Glide.with(image_checkout.getContext()).load(mycartlist.imageUrl)
.signature(ObjectKey(mytime)).into(image_checkout)
.clearOnDetach()
} finally {
image_checkout.setImageResource(R.drawable.noimage)
}
}
}
inner class ViewHolder2(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bindView2(mycartlist: MyOrderList){
itemView.checkout_inside_textview.text = mycartlist.pid
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
var myorderviewtype = myOrder.get(viewType)
return when (myorderviewtype.pid) {
"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)
)
}
}
}
override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) {
val gsonRaw = GsonBuilder().create()
var pos = viewHolder.getAdapterPosition()
var mycartlist: MyOrderList = myOrder.get(position)
when (viewHolder) {
is ViewHolder2 -> {
val liquorviewHolder = viewHolder as ViewHolder2
liquorviewHolder.bindView2(mycartlist)
}
is ViewHolder1 -> {
val liquorviewHolder = viewHolder as ViewHolder1
liquorviewHolder.bindView1(mycartlist)
}
}
}
嘿,您还没有覆盖getItemViewType方法。试用以下代码。
由于您没有使用getItemViewType发送viewType,因此在onCreateViewHolder中始终获得0。
In your adapter class, you need to override the
getItemViewType
method. Like this:Then in your
onCreateViewHolder
method, you use the viewType paramter to inflate the required view:}