android - 使用 RecycleView 的多视图 - Kotlin(Android) - 无法切换视图
问题描述
我已经浏览了几天来解决我的问题,但我很困惑,无法弄清楚问题所在。我是 Android/Kotlin 的相对初学者,所以请多多包涵。
我有一个如下所示的数据类,并从静态源填充了 pid 值等。
类 MyOrderList(var pid: String, var name: String, var imageUrl: String, var size: String, var description: String, val price: Int, var count: Int, var itemtotal: Int)
这个想法基本上是,如果你遍历上面的类列表,pid 通常由一个数字或一个特定的单词表示,例如“LIQUID”。所以在我的列表中,位置 0 会显示 pid = "LIQUID",而位置 1 是一个数字,比如 pid = 2。
我想创建一个 recyclerview,当它在列表中看到 LIQUID 作为 pid 时,它将使用 viewholder2 和它自己的布局。否则它将使用 viewholder1 和它自己的布局。
问题是我创建的 recyclerview 只显示一个视图。如果位置 0 pid 是 LIQUID 则 viewholder 是 ViewHolder2 即使对于列表中的后续项目,PID 不再是 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 方法。试试下面的代码。
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。
推荐阅读
- apache-kafka - 如何跟踪谁在 Kafka 中发布了消息?
- r - 在数据帧替换中出错有 0 数据有 x
- r - 在 R 中跨多个列的线性模型
- java - 为 Realtime firebase 创建参考变量时出错
- java - 通过API获取java进程的RSS内存使用情况
- typescript - 保留“keyof T”信息的 Object.entries?
- r - 如何使用 mult 消除 data.table 中的重复项
- javascript - 用于检索 WIX 数据库 JSON 文件的 Excel 中的 API
- sas - 在 SAS 中,如何从值中删除小数点?
- makefile - 根据文件的年龄在 Makefile 中运行不同的代码