【发布时间】: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>
【问题讨论】: