kotlin.Unit 不能转换为 java.util.List用于 getFilter 上的自定义适配器

问题描述

我正在使用自定义适配器在 AutoTextComplete 上显示联系人列表,但是当我尝试运行它时,出现错误“kotlin.Unit cannot be cast to java.util.List”

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

Contact 是一个 Serializable 对象,这就是我如何将联系人姓名作为列表中的对象检索 - 代码如下...我曾尝试在别处寻找解决方案,但无法解决...如果可以的话重定向解决方案或指南将是惊人的谢谢

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 documentations Branches of if branches can be blocks. In this case,the last expression is the value of a block

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

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

您会在 temp = 5 处看到 ide 错误,因为它返回 Unit 而 result 需要 Int。

总结一下,你只需要改变你的else块如下:

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