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的点击。 但若是用setOnTouchListener来监听Item就不会覆盖setOnItemSelectedListener监听,但当咱们点击Spinner时也要注意,若是点击的区域在Item区域,同样会触发setOnTouchListener监听,若是点击的是绿色区域外则不会触发setOnTouchListener。(如上图)。 通过学习发现,SpinnerAdapter的子类BaseAdapter有一方法getDropDownView,此方法用来显示全部下拉出来的Item,而getView方法是用来显示Spinner上面的一个Item,而getDropDownView默认返回值是getView的返回值,这就意味着能够把本来写在getView中的代码写在getDropDownView中,监听也写在此,getView中保留除监听之外的代码,这样当点击Spinner时不再会触发点击Item的效果了,但仍是只能用setOnTouchListener监听,由于长按和短按监听会覆盖setOnItemSelectedListener监听。 |