首页 > 解决方案 > 使用 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)
        }
    }

}

标签: androidkotlinandroid-recyclerviewmultiview

解决方案


嘿,您还没有覆盖 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。


推荐阅读