我在我的应用程序中实现了ExposedDropdownMenu,虽然手腕很笨拙,但可以完成工作,而且我可以按照自己的方式对其进行样式设置。在我的国家“纺纱厂”上,如果要选择加拿大,我希望将州列表更改为省,然后用加拿大省列表填充。当我的“旋转器”是实际的Spinner
时,OnItemSelectedListener
可以正常工作,但是,由于我已经将“旋转器”实现为EDM,因此不再来回改变
这是我的代码:
// get country spinner values and change state/zip options depending on country selected
val countryAdapter = MaterialSpinnerAdapter<String>(it, R.layout.material_spinner_item, it.resources.getStringArray(R.array.country))
country_dropdown.setAdapter(countryAdapter)
country_dropdown.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(
parent: AdapterView<*>?,
view: View?,
position: Int,
id: Long
) {
displayStatesForSelectedCountry(position)
}
override fun onNothingSelected(parent: AdapterView<*>?) {
displayDefaultStatesList()
}
}
private fun displayStatesForSelectedCountry(position: Int) {
context?.let {
val canadaAdapter = MaterialSpinnerAdapter<String>(it, R.layout.material_spinner_item, it.resources.getStringArray(R.array.states_of_canada))
when(position) {
1 -> {
displayDefaultStatesList()
}
2 -> {
state_dropdown.setAdapter(canadaAdapter)
enrollment_zip_code.hint = it.resources.getString(R.string.enrollment_hint_postal_code)
enrollment_zip_code.editText?.inputType = InputType.TYPE_CLASS_TEXT
}
else -> displayDefaultStatesList()
}
}
}
考虑到行为可能已经改变,我尝试实现OnItemClickedListener
:
country_dropdown.setOnItemClickListener { parent: AdapterView<*>?,
view: View?,position:
Int,id: Long ->
displayStatesForSelectedCountry(position)
}
没有骰子。我知道监听器根本没有被调用,因为邮政编码提示至少会更改为邮政编码,但是不会。我在这里做错了什么?我不应该使用这个职位吗?如果没有,为什么不呢? MaterialSpinnerAdapter
只是ArrayAdapter
的子类,当我不想对其进行过滤时可以阻止过滤,但是我应该能够可靠地使用该位置来确定要显示的内容。
答案 0 :(得分:2)
我发现它的类型为EditText
,因此可以正常工作:
country_dropdown.addTextChangedListener(object: TextWatcher {
override fun afterTextChanged(s: Editable?) {
}
override fun beforeTextChanged(
s: CharSequence?,
start: Int,
count: Int,
after: Int
) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
displayStatesForSelectedCountry(s.toString())
viewModel.country.value = s.toString()
}
})