setOnItemClickListener和setOnClickListener都不能用来监听Spinner,否则会出错。

setOnLongClickListener能用来监听Spinner的长按事件,只能监听Spinner被长按住,好像基本用不上。

setOnTouchListener能用来监听Spinner控件的触摸事件,注意一次快速的触摸都能触发这事件好几次。

 

setOnHierarchyChangeListener用来监听显示在Spinner上面的view的变化的,需要重写两个方法。当点击Spinner选择一个item时会触发这个监听,如果选择的是一个不同的item,会执行方法onChildViewRemoved-----onChildViewAdded-----onChildViewRemoved。当选择的item没变化时。执行onChildViewRemoved---onChildViewAdded。

用方法spinner.removeAllViewsInLayout()可以清除Spinner控件上显示的信息,会触发setOnHierarchyChangeListener的onChildViewRemoved方法,当清除Spinner控件上显示的信息后再点击Spinner控件选择Item,如果选择的item和之前显示的item是同一个,那么执行onChildViewAdded---onChildViewRemoved---onChildViewAdded,并且Spinner上面显示的信息将变成第0个信息。如果不是同一个Item,那么onChildViewAdded---onChildViewRemoved---onChildViewAdded---onChildViewRemoved。

setOnItemSelectedListener监听Spinner里面的item选项的选择事件,重写两个方法,当选择时触发onItemSelected方法,但是,如果选择的item和选择前的item是同一个,那么此方法将不会被触发。第二个方法是onNothingSelected,我测试了很多次,触发不了这个方法,不知道在什么情况下触发,如果谁知道,请教我,谢谢!

我尝试给Spinner的item写监听(我用的BaseAdapter,在getView方法中给要返回的View监听),发现长按监听setOnLongClickListener和短按监听setOnClickListener都能监听Spinner的item,但写了监听后Spinner的setOnItemSelectedListener监听被覆盖掉了,被选中的Item能够点击到,也就是说item和Spinner控件浮在同一个View,点击Spinner中间的Item是不会触发Spinner的点击只会触发Item的点击。

Android 监听屏幕点击时间 安卓spinner监听事件_触摸事件

但如果用setOnTouchListener来监听Item就不会覆盖setOnItemSelectedListener监听,但当我们点击Spinner时也要注意,如果点击的区域在Item区域,一样会触发setOnTouchListener监听,如果点击的是绿色区域外则不会触发setOnTouchListener。(如上图)。

经过学习发现,SpinnerAdapter的子类BaseAdapter有一方法getDropDownView,此方法用来显示所有下拉出来的Item,而getView方法是用来显示Spinner上面的一个Item,而getDropDownView默认返回值是getView的返回值,这就意味着可以把原本写在getView中的代码写在getDropDownView中,监听也写在此,getView中保留除监听以外的代码,这样当点击Spinner时再也不会触发点击Item的效果了,但还是只能用setOnTouchListener监听,因为长按和短按监听会覆盖setOnItemSelectedListener监听。