问题描述
场景: 我正在使用Spinner进行日期范围选择,效果很好。问题是,有一个选项“自定义范围”必须打开自定义日期范围选择器。尽管它第一次运行正常。
问题是:
当用户再次单击它时,它不会调用onItemSelected(parent: AdapterView<*>?,view: View?,position: Int,id: Long)
(这是Spinner的功能)。但是从用户的角度来看,这是一个错误。
有什么办法,我们可以在Spinner的一个已选择项目上获得任何选择事件吗?
解决方法
要在Spinner
中已选择的项目上调用事件,您可以通过以下方式进行操作:
- 通过扩展
AppCompatSpinner
创建自己的Spinner类:
import android.content.Context
import android.util.AttributeSet
import android.util.Log
class MySpinner(context: Context,attrs: AttributeSet?) : androidx.appcompat.widget.AppCompatSpinner(
context,attrs
)
{
var listener: OnItemSelectedListener? = null
override fun setSelection(position: Int)
{
super.setSelection(position)
if (position == selectedItemPosition)
{
listener!!.onItemSelected(this,selectedView,position,selectedItemId)
}
}
override fun setOnItemSelectedListener(listener: OnItemSelectedListener?)
{
this.listener = listener
}
}
- 在您的布局中使用它:
<com.yourcompany.kotlintest.MySpinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
- 创建布局时,请执行以下操作:
class MainActivity : AppCompatActivity()
{
override fun onCreate(savedInstanceState: Bundle?)
{
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val spinner = findViewById<MySpinner>(R.id.spinner)
spinner.adapter = ArrayAdapter(
this,android.R.layout.simple_spinner_dropdown_item,arrayListOf("One","Two","Three")
)
spinner.onItemSelectedListener = object :
AdapterView.OnItemSelectedListener
{
override fun onItemSelected(
parent: AdapterView<*>,view: View,position: Int,id: Long
)
{
Log.d("MyTag","Click item at pos $position")
}
override fun onNothingSelected(parent: AdapterView<*>)
{
Log.d("MyTag","Nothing selected")
}
}
}
}
现在,当您重新选择相同项目时,将执行
,您使用过
function handleGenerateFibonacci(event) {
for (const n of generator(limit)) {
arr.push(n)
}
setArr([...arr])
event.preventDefault();
}