我知道有几个问题涉及在第一次选择之前如何为Spinner
添加“选择一个......”提示的问题。但那不是我的情况。
我需要的是在SpinnerAdapter
为空时显示提示 。默认情况下,在这种情况下,没有任何事情发生在点击(但这不是主要问题),最重要的是,微调器不显示任何文本,所以它看起来像这样,显然感觉不对:
知道如何简单地处理这个问题吗?我想出了两个可能的解决方案,但我不太喜欢它们中的任何一个:
SpinnerAdapter
为空,请隐藏布局中的Spinner
并显示与Spinner具有相同背景的TextView
。SpinnerAdapter
,如果内部列表为空,则getCount()
会返回1
而不是0
,并同时拥有getView()
返回带有所需“空”消息的TextView
,可能是灰色的。但是,如果所选项目不是“空”项,则需要进行特定检查。答案 0 :(得分:0)
您可以在下面使用此SpinnerWithHintAdapter
类
class SpinnerWithHintAdapter(context: Context, resource: Int = android.R.layout.simple_spinner_dropdown_item) :
ArrayAdapter<Any>(context, resource) {
override fun isEnabled(position: Int): Boolean {
return position != 0
}
override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
return (super.getDropDownView(position, convertView, parent) as TextView).apply {
if (position == 0) {
// Set the hint text color gray
setTextColor(Color.GRAY)
} else {
setTextColor(Color.BLACK)
}
}
}
fun attachTo(spinner: Spinner, itemSelectedCallback: ((Any?) -> Unit)? = null) {
spinner.apply {
adapter = this@SpinnerWithHintAdapter
itemSelectedCallback?.let {
onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onNothingSelected(parent: AdapterView<*>?) {}
override fun onItemSelected(
parent: AdapterView<*>?,
view: View?,
position: Int,
id: Long
) {
val selectedItem = parent?.getItemAtPosition(position)
// If user change the default selection
// First item is disable and it is used for hint
if (position > 0) {
it(selectedItem)
}
}
}
}
}
}
}
如何使用?假设我有一个名为City
data class City(
val id: Int,
val cityName: String,
val provinceId: Int
) {
/**
* By overriding toString function, you will show the dropdown text correctly
*/
override fun toString(): String {
return cityName
}
}
在活动中,启动适配器,添加提示(第一个项目),添加主要项目,最后将其附加到微调器上。
SpinnerWithHintAdapter(this@MyActivity)
.apply {
// add hint
add("City")
// add your main items
for (city in cityList) add(city)
// attach this adapter to your spinner
attachTo(yourSpinner) { selectedItem -> // optional item selected listener
selectedItem?.apply {
if (selectedItem is City) {
// do what you want with the selected item
}
}
}
}