簡體   English   中英

Android Kotlin AutoCompleteTextView 項目顯示整個項目 Object 單擊時

[英]Android Kotlin AutoCompleteTextView item shows whole item Object when clicked

So I have an AutoCompleteTextView that its dropdownlist populated with data from an array of object that formed from two different arrays by using the zip function.

我想要的是,當單擊 AutoCompleteTextView 下拉項的每個項時,它將返回單擊項 object 的屬性之一。

(這個問題與這個問題有點相似,但是即使在閱讀了評論后我仍然不明白該怎么做)。

這是聲明 AutoCompleteTextView newProcodeEditFormEditText的 Fragment 的代碼片段:

 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}")

        }

這是創建的 object 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
            }
        }
    }

}

這是我使用的數據 class:

 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>

當您 select 來自AutoCompleteTextView的任何項目時,它將返回 ProcodeRecommendationListDataClass 的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}")

        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM