Spinner - 适配器为空时显示提示

时间:2013-09-05 22:06:09

标签: android android-spinner

我知道有几个问题涉及在第一次选择之前如何为Spinner添加“选择一个......”提示的问题。但那不是我的情况。

我需要的是在SpinnerAdapter为空时显示提示 。默认情况下,在这种情况下,没有任何事情发生在点击(但这不是主要问题),最重要的是,微调器不显示任何文本,所以它看起来像这样,显然感觉不对:

enter image description here

知道如何简单地处理这个问题吗?我想出了两个可能的解决方案,但我不太喜欢它们中的任何一个:

  • 如果SpinnerAdapter为空,请隐藏布局中的Spinner并显示与Spinner具有相同背景的TextView
  • 实施自定义SpinnerAdapter,如果内部列表为空,则getCount()会返回1而不是0,并同时拥有getView()返回带有所需“空”消息的TextView,可能是灰色的。但是,如果所选项目不是“空”项,则需要进行特定检查。

1 个答案:

答案 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
                }
            }
        }
    }