Android解决Spinner初始化时自动选择第一个 item 及点击已选中的 item 时不触发Listener问题
程序员文章站
2023-11-30 14:40:22
spinner 这个控件是我目前在开发中遇到的特性最奇怪的控件了,说它奇怪是指有点反直觉,比如说,为什么初始化时要自动选择第一个 item?以及为什么同一个 item 选中第二次的时候不触发 oni...
spinner 这个控件是我目前在开发中遇到的特性最奇怪的控件了,说它奇怪是指有点反直觉,比如说,为什么初始化时要自动选择第一个 item?以及为什么同一个 item 选中第二次的时候不触发 onitemselectedlistener?重复选中也是选中呀!下面说下是如何解决这个问题的。
增加一个默认为 true 的全局变量,用来作为判断是否为初始化自动选中的标志位。 重写 spinner 的 setselection 方法。spinner.setonitemselectedlistener(new adapterview.onitemselectedlistener() { @override public void onitemselected(adapterview parent, view view, int position, long id) { logger.d(this,"spinner position = "+ position); if (isinitial) { isinitial = false; return; } logger.d(this, "spinner 被触发了"); // do sth here... } @override public void onnothingselected(adapterview parent) { } });
public class myspinner extends android.support.v7.widget.appcompatspinner { private static final string tag = "ybz_spinner"; private int lastposition = 0; public myspinner(context context, int mode) { super(context, mode); } public myspinner(context context, attributeset attrs) { super(context, attrs); } public myspinner(context context, attributeset attrs, int defstyleattr) { super(context, attrs, defstyleattr); } public myspinner(context context, attributeset attrs, int defstyleattr, int mode) { super(context, attrs, defstyleattr, mode); } // 一个 item 选中的时候,总是会触发 setselection 方法 // 所以在这个方法中,我们记录并检查上一次的selection position 就行了,如果是相同的,手动调用监听即可 @override public void setselection(int position, boolean animate) { super.setselection(position, animate); if (position == lastposition){ getonitemselectedlistener().onitemselected(this,null,position,0); } lastposition = position; } @override public void setselection(int position) { super.setselection(position); if (position == lastposition){ getonitemselectedlistener().onitemselected(this,null,position,0); } lastposition = position; } }