无法将列表转换为 Kotlin 中的特定数据类到 %Class%

问题描述

我的数据类:

import android.os.Parcel
import android.os.Parcelable

data class Product(
    var name: String? = " ",var price:Long = 0,var Image: String? = " "
):Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString(),parcel.readLong(),parcel.readString()
    ) {
    }

    override fun writetoParcel(parcel: Parcel,flags: Int) {
        parcel.writeString(name)
        parcel.writeLong(price)
        parcel.writeString(Image)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<Product> {
        override fun createFromParcel(parcel: Parcel): Product {
            return Product(parcel)
        }

        override fun newArray(size: Int): Array<Product?> {
            return arrayOfNulls(size)
        }
    }
}

我试图在课堂上清除一个列表。 类是:

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Filter
import android.widget.Filterable
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.example.demoshop.Activity.MainActivity
import com.example.demoshop.Model.Product
import com.example.demoshop.R
import kotlinx.android.synthetic.main.single_item.view.*
import java.util.*

class ProductAdapter(
    private val products:MutableList<Product>,private val context:Context)
    : RecyclerView.Adapter<MainActivity.ProductViewHolder>(),Filterable {
    var filteredProduct :MutableList<Product> = products


    override fun onCreateViewHolder(
        parent: ViewGroup,viewType: Int
    ): MainActivity.ProductViewHolder {
        val view: View = LayoutInflater.from(parent.context).
        inflate(
            R.layout.single_item,parent,false
        )
        return MainActivity.ProductViewHolder(view)
    }

    override fun onBindViewHolder(holder: MainActivity.ProductViewHolder,position: Int) {

        holder.itemView.tittle.text = filteredProduct[position].name
        holder.itemView.product_price.text = filteredProduct[position].price.toString()
        Glide
            .with(context)
            .load(filteredProduct[position].Image)
            .into(holder.itemView.product_image);

    }

    override fun getItemCount(): Int {
        return filteredProduct.size
    }


    override fun getFilter(): Filter {
        return object : Filter() {
            override fun performFiltering(constraint: CharSequence?): FilterResults {
                val pattern: String = constraint.toString().toLowerCase(Locale.ROOT)
                var filteredList = mutablelistof<Product>()
                if (pattern.isEmpty() || pattern==null) {
                    filteredList = products
                } else {
                    for (p: Product in products) {
                        if (p.name!!.toLowerCase(Locale.ROOT).contains(pattern)) {
                            filteredList.add(p)
                        }
                    }
                }
                val filterResults = FilterResults()
                filterResults.values = filteredList

                return filterResults

            }

            override fun publishResults(
                constraint: CharSequence?,results: FilterResults?
            ) {
                filteredProduct.clear()
                filteredProduct = mutablelistof(results!!.values) as MutableList<Product>
                notifyDataSetChanged()
            }

        }
    }

}

我的日志:

2021-01-04 09:36:34.895 17122-17122/com.example.demoshop E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.demoshop,PID: 17122
    java.lang.classCastException: java.util.ArrayList cannot be cast to com.example.demoshop.Model.Product
        at com.example.demoshop.adapter.ProductAdapter.onBindViewHolder(productAdapter.kt:39)
        at com.example.demoshop.adapter.ProductAdapter.onBindViewHolder(productAdapter.kt:17)

解决方法

发生崩溃是因为您试图将 List<List<Product>> 转换为 List<Product>。调用 mutableListOf(results!!.values) 会创建一个额外的包装列表。

修改代码如下:

override fun publishResults(
                constraint: CharSequence?,results: FilterResults?
            ) {
                filteredProduct.clear()
                filteredProduct = results!!.values as MutableList<Product>
                notifyDataSetChanged()
            }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...