[英]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.