【问题标题】:Android Kotlin AutoCompleteTextView item shows whole item Object when clickedAndroid Kotlin AutoCompleteTextView 项目在单击时显示整个项目对象
【发布时间】:2020-06-25 11:54:07
【问题描述】:

所以我有一个 AutoCompleteTextView,它的下拉列表中填充了来自使用 zip 函数由两个不同数组形成的对象数组的数据。

我想要的是,当单击 AutoCompleteTextView 下拉项的每个项时,它将返回单击项对象的属性之一。

(这个问题和this的问题有点类似,不过看了cmets我还是不明白该怎么办)。

这是声明 AutoCompleteTextView newProcodeEditFormEditText 的 Fragment 中的 sn-p 代码:

 val procodeRecommendationList = allProductCodeList.zip(allProductNameList)
            .map { (allProductCodeList, allProductNameList) -> ProcodeRecommendationListDataClass(allProductCodeList, allProductNameList) }

        //This is where the created list of object being logged
        Log.i("Order", "Created List of objects: $procodeRecommendationList")


        //Set up adapter for these recommender
        val recommendedProductNameListAdapter = ArrayAdapter((activity as AppCompatActivity), android.R.layout.simple_list_item_1, allProductNameList)
        val recommendedProductCodeListAdapter = ProcodeRecommendationAdapter(activity as AppCompatActivity, R.layout.procode_recommendation_list_item_layout, procodeRecommendationList.toTypedArray())

        newProcodeEditFormEditText.threshold = 1
        newProductNameEditFormEditText.threshold = 1


        //Connect the adapter to each editText
        newProcodeEditFormEditText.setAdapter(recommendedProductCodeListAdapter)
        newProductNameEditFormEditText.setAdapter(recommendedProductNameListAdapter)


        //This is the onclick listener for the items in the AutoCompleteTextView Dropdown
        newProcodeEditFormEditText.setOnItemClickListener { parent, view, position, id ->
            val selectedItem = parent.getItemAtPosition(position)
            Toast.makeText((activity as AppCompatActivity), "Selected : ".plus(selectedItem), Toast.LENGTH_LONG).show()

            Log.i("Order", "Selected item: ${selectedItem}")

        }

这是创建的对象 procodeRecommendationList 的列表,如 LogCat 所示:

这就是 LogCat 中显示的点击项返回的内容(存储在变量 selectedItem 中):

正如预期的那样,它在 AutoCompleteTextView 中显示如下:

这是我用来在 AutoCompleteTextView 下拉菜单中显示项目的自定义适配器:

  class ProcodeRecommendationAdapter(private val c: Context,
                                   @LayoutRes private val layoutResource: Int,
                                   private val items: Array<ProcodeRecommendationListDataClass>)
    : ArrayAdapter<ProcodeRecommendationListDataClass>(c, layoutResource, items) {

    var filteredRecommendations: List<ProcodeRecommendationListDataClass> = listOf()

    override fun getCount(): Int = filteredRecommendations.size

    override fun getItem(position: Int): ProcodeRecommendationListDataClass = filteredRecommendations[position]

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val view = convertView ?: LayoutInflater.from(c).inflate(layoutResource, parent, false)

        view.tvProcode.text = filteredRecommendations[position].procode
        view.tvProname.text = filteredRecommendations[position].productName

        return view
    }

    override fun getFilter(): Filter {
        return object : Filter() {
            override fun publishResults(charSequence: CharSequence?, filterResults: FilterResults) {
                @Suppress("UNCHECKED_CAST")
                filteredRecommendations = filterResults.values as List<ProcodeRecommendationListDataClass>
                notifyDataSetChanged()
            }

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

                val filterResults = FilterResults()
                filterResults.values = if (queryString == null || queryString.isEmpty())
                    items.asList()
                else
                    items.filter {
                        it.procode?.toLowerCase(Locale.ROOT)!!.contains(queryString)
                    }

                return filterResults
            }
        }
    }

}

这是我使用的数据类:

 data class ProcodeRecommendationListDataClass(
    val procode: String?,
    val productName: String?
)

到目前为止,填充 AutoCompleteTextView 下拉项没有问题。

我想要的是我想要获得procode 属性,因此它只会在 AutoCompleteTextView 中显示0100009,而不是在单击项目时显示ProcodeRecommendationListDataClass(procode=0100009, productName=TARIVID OTIC 3MG EAR DROPS 5ML)

我怎样才能实现这样的目标?我应该在哪里更改适配器代码?如果有任何我遗漏的细节,请告诉我!

编辑:

如果有人需要 AutoCompleteTextview 项目布局,这里:

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp">

    <TextView
        android:id="@+id/tvProcode"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tvProname"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:textStyle="bold|italic"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tvProcode" />

</androidx.constraintlayout.widget.ConstraintLayout>

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    当您从AutoCompleteTextView 中选择任何项目时,它将返回ProcodeRecommendationListDataClass 的对象

    您需要像下面的代码一样访问它

    newProcodeEditFormEditText.setOnItemClickListener { parent, view, position, id ->
                val selectedItem = parent.getItemAtPosition(position) as ProcodeRecommendationListDataClass
                Toast.makeText((activity as AppCompatActivity), "Selected : ".plus(selectedItem.procode), Toast.LENGTH_LONG).show()
                Toast.makeText((activity as AppCompatActivity), "Selected : ".plus(selectedItem.productName), Toast.LENGTH_LONG).show()
    
                newProcodeEditFormEditText.setText(selectedItem.procode)
                Log.i("Order", "Selected item: ${selectedItem}")
    
            }
    

    【讨论】:

    • 非常感谢老兄!我怎么没想到……无论如何,您应该通过在这两个Toast.makeText(...) 行下方添加newProcodeEditFormEditText.setText(selectedItem.procode) 来编辑您的答案,以便将来帮助其他用户
    猜你喜欢
    • 2020-07-03
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    相关资源
    最近更新 更多