kotlin.Unit 无法转换为 java.util.List。对于 getFilter 上的自定义适配器

kotlin.Unit cannot be cast to java.util.List. for Custom Adapter on getFilter

我正在使用自定义适配器在 AutoTextComplete 上显示联系人列表,但是当我尝试 运行 时,出现错误“kotlin.Unit 无法转换为 java.util.List”对于

mContact = filterResults.values **as List<Contact>**

Contact 是一个可序列化对象,也是我如何将联系人姓名作为列表中的对象检索的方式 - 代码如下...我曾尝试在其他地方寻找解决方案,但未能解决...如果您可以重定向或解决方案或指南将是惊人的谢谢

private var invoice: Invoice? = null
private lateinit var contact: Contact
private var invoiceItems: List<InvoiceItems>? = null
private lateinit var contactSelect: ArrayList<Contact>
private lateinit var dueDate: Calendar
private val calendar = Calendar.getInstance()
private var total = 0
private var subTotal = 0
private var taxrate = 0
private var invoiceType: String = ""
private var invoiceUpdt: InvoiceItems? = null
private var j: String? = null
private var clientLkey: String? = ""

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_edit_invoice)

    val toolbar: Toolbar = findViewById(R.id.toolbar_editinv)
    setSupportActionBar(toolbar)
    supportActionBar?.setDisplayShowHomeEnabled(true)

    val invoiceClient = findViewById<AutoCompleteTextView>(R.id.invoiceClient)
    val invoiceDueDt = findViewById<TextView>(R.id.invoiceDueDt)
    dueDate = Calendar.getInstance()

    //getting values from intent
   invoice = intent.getSerializableExtra("invoice") as? Invoice
   invoiceItems = intent.getSerializableExtra("invoiceItem") as? List<InvoiceItems>
   invoiceUpdt = intent.getSerializableExtra("invoiceItemUpdt") as? InvoiceItems
   j = intent.getStringExtra("i")

    if (invoice == null){
        invoiceType = "new"
        supportActionBar?.title = "Add Invoice"
        addinvoiceItem()
    } else {
        editInvoice()
    }

    //Setup Due date for the invoice
    invoiceDueDt.setOnClickListener {
        showCalendar()
    }

    //Auto complete based on database for selecting the client
    val clientContact: List<Contact> = ArrayList<Contact>()
    val adapter = ClientSelectAdapter(this, R.layout.userlatomcontacts, clientContact)
    invoiceClient.setAdapter(adapter)
    invoiceClient.threshold = 2

    invoiceClient.setOnItemClickListener { parent, _, position, id ->
        val selectedClient = parent.adapter.getItem(position) as Contact?
        invoiceClient.setText(selectedClient?.name)
        clientLkey = selectedClient?.lookupKey
    }
}

inner class ClientSelectAdapter(
    context: Context,
    @LayoutRes private val layoutResource: Int,
    private var allContacts: List<Contact>
):
    ArrayAdapter<Contact>(context, layoutResource, allContacts),
    Filterable {private var mContact: List<Contact> = allContacts

    override fun getCount(): Int {
        return mContact.size
    }

    override fun getItem(p0: Int): Contact {
        return mContact[p0]

    }
    override fun getItemId(p0: Int): Long {
        // Or just return p0
        return mContact[p0].id.toLong()
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {

        var view = convertView
        if (view == null) {
            view = LayoutInflater.from(parent.context)
                .inflate(layoutResource, parent, false)
        }
        val invoiceClient = view!!.findViewById<View>(R.id.invoiceClient) as TextView
        invoiceClient.text = mContact[position].name
        val clientProfile = view.findViewById<View>(R.id.profile_image) as ShapeableImageView

        Picasso.get().load(mContact[position].photoUri)
            .placeholder(R.drawable.ic_baseline_whatshot_24).fit().centerCrop()
            .into(clientProfile)

        return view
    }

    override fun getFilter(): Filter {
        return object : Filter() {
            override fun publishResults(
                charSequence: CharSequence?,
                filterResults: FilterResults
            ) {
                **mContact = filterResults.values as List<Contact>**
                notifyDataSetChanged()
            }

            override fun performFiltering(charSequence: CharSequence?): FilterResults {
                val queryString = charSequence?.toString()?.toLowerCase(Locale.ROOT)

                val results = FilterResults()
                results.values = if (queryString == null || queryString.isEmpty())
                    allContacts
                else {
                    val db = AppDatabase.getDatabase(context)
                    allContacts = db.contactsDao().getBySearch(queryString)
                }
                return results
            }


        }
    }
}

根据kotlin documentationsBranches of if branches can be blocks. In this case, the last expression is the value of a block

所以,在你的情况下,当代码进入 else 块时,最后一个表达式是赋值,而赋值 return kotlin 中的单元。你可以用这个简单的例子来检查这种情况:

var temp = 0
var result: Int = if (temp > 0) {
    5
} else {
    temp = 5
}

您会在 temp = 5 处看到 ide 错误,因为它 returns Unit 而结果需要 Int。

综上所述,您只需按如下方式更改您的 else 块:

else {
   val db = AppDatabase.getDatabase(context)
   allContacts = db.contactsDao().getBySearch(queryString)
   allContacts
}