Android Spinner重复选中某一项获取监听的方法

问题

使用Android SDK自带的Spinner控件时,如果当前已经选中了一项,再次点开Spinner的下拉菜单并选中相同一项时,不会触发OnItemSelectedListener
的onItemSelected()回调方法,因此无法获知用户再次选中了相同项.一般情况下,如果用户选中相同项,我们确实不需要做任何操作,因此也就不关心该项是否再次
被用户选择.但是有些时候,仍需要获取这样的监听.比如一个Spinner的菜单是本日,本周,本月,自定义时,当用户选中自定义时间段后,想再次改变
自定义的时间段,此时Spinner并不能触发再次点击自定义项的回调.问题由此而来.

解决办法

网上有很多相关解决办法,还有说不用Spinner转而用PopupWindow+ListView手动实现一个的.目前看来一下方法最简单:

使用自定义的ReSpinner,继承自Spinner.当相同项被选中时,手动触发OnItemSelectedListener的onItemSelected()方法.代码如下:

    import android.content.Context;
    import android.util.AttributeSet;
    import android.widget.Spinner;
    
    public class ReSpinner extends Spinner {
        public boolean isDropDownMenuShown=false;//标志下拉列表是否正在显示
    
        public ReSpinner(Context context) {
            super(context);
        }
    
        public ReSpinner(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public ReSpinner(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        @Override
        public void
        setSelection(int position, boolean animate) {
            boolean sameSelected = position == getSelectedItemPosition();
            super.setSelection(position, animate);
            if (sameSelected) {
                // 如果选择项是Spinner当前已选择的项,则 OnItemSelectedListener并不会触发,因此这里手动触发回调
                getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
            }
        }
    
        @Override
        public boolean performClick() {
            this.isDropDownMenuShown = true;
            return super.performClick();
        }
    
        public boolean isDropDownMenuShown(){
            return isDropDownMenuShown;
        }
    
        public void setDropDownMenuShown(boolean isDropDownMenuShown){
            this.isDropDownMenuShown=isDropDownMenuShown;
        }
    
        @Override
        public void
        setSelection(int position) {
            boolean sameSelected = position == getSelectedItemPosition();
            super.setSelection(position);
            if (sameSelected) {
                getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
            }
        }
    
        @Override
        public void onDetachedFromWindow() {
            super.onDetachedFromWindow();
        }
    }

相关参考

How can I get an event in Android Spinner when the current selected item is selected again?
原文地址 http://www.trojx.me/2017/02/17/spinner-reselect/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,856评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,797评论 19 139
  • 翻译自“Collection View Programming Guide for iOS” 0 关于iOS集合视...
    lakerszhy阅读 9,331评论 1 22
  • 有了它,创业不成问题! 有人说,所有孵化器都是为创业者和创业企业而存在的,那什么是孵化器...
    辣子不太辣阅读 2,744评论 0 0
  • 我很喜欢一个人,那个人也很喜欢我。可是可是,你经历过绝望吗? 在认识你的时候,我们就距离好远好远了。刚认识你的时候...
    长发鬼鬼阅读 3,499评论 0 5