【问题标题】:Android Spinner: onItemSelected listener is not called when selecting the same itemAndroid Spinner:选择相同项目时不调用onItemSelected监听器
【发布时间】:2015-07-31 09:36:36
【问题描述】:

在选择Spinner 中的第二项时,我需要显示AlertDialog。我知道使用onItemSelected 我们可以收听微调器选择并显示一个弹出窗口。问题是当我选择第二个项目时,对话框出现,但在关闭对话框后,我们再次选择相同的项目,它不会显示对话框,因为onItemSelected 不会被调用。有什么解决方法吗?不使用自定义 Spinner 实现。

【问题讨论】:

  • 发布您的代码.. 像这样没有代码的问题会让人们对您的问题投反对票。
  • @HarishSridharan 虽然大多数情况下都是如此,但这正是不需要代码的问题类型。如果您知道这种情况,那么重建 OP 的代码可能看起来很简单。拥有一个 Spinner 和一个侦听器来检查 position 参数并做某事并不是一件难事。我认为出于某种原因,有些人会否决他们不理解的问题。
  • @TWiStErRob 谢谢..你说了我应该评论的..这不需要任何代码来理解。一个微调器,它的监听器和它的完成。
  • @sJy 在监听器中尝试spinner.setSelection(Spinner.INVALID_POSITION);,所以onItemSelected 也总是会触发onNothingSelected 事件。这意味着您将失去对所选项目的跟踪,但我觉得这对这种情况来说没什么大不了的。你也可以尝试只在position == 1时调用。
  • @TWiStErRob 它不起作用..onNothingSelected 在任何情况下都不会被调用..

标签: android listener android-spinner


【解决方案1】:

创建自定义微调器

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Spinner;

public class CustomSpinner extends Spinner {
    OnItemSelectedListener listener;
    private AdapterView<?> lastParent;
    private View lastView;
    private long lastId;

    public CustomSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        initlistner();
    }

    @Override
    public void setSelection(int position) {
        if (position == getSelectedItemPosition() && listener != null) {
            listener.onItemSelected(lastParent, lastView, position, lastId);
        } else {
            super.setSelection(position);
        }

    }

    private void initlistner() {
        // TODO Auto-generated method stub
        super.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {
                // TODO Auto-generated method stub
                lastParent = parent;
                lastView = view;
                lastId = id;
                if (listener != null) {
                    listener.onItemSelected(parent, view, position, id);
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // TODO Auto-generated method stub
                if (listener != null) {
                    listener.onNothingSelected(parent);
                }
            }
        });

    }

    public void setOnItemSelectedEvenIfUnchangedListener(
            OnItemSelectedListener listener) {
        this.listener = listener;
    }

}

设置监听器

private OnItemSelectedListener listener;

listener = new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {}

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }
    };

将监听器对象传递给自定义监听器

cusSpinner.setOnItemSelectedEvenIfUnchangedListener(listener);

【讨论】:

  • 谢谢..实际上我需要如果没有自定义微调器就可以做到这一点..我知道自定义微调器可以轻松处理这个..
  • 我正在尝试将此功能添加到 react-native 但不知道如何修改它来实现这一点,请您提供一些关于我需要做的最小更改的提示以实现这一点在此处提交文件 - github.com/facebook/react-native/blob/… - 我是一个 JavaScript 人,这是我第一次涉足 Java。
  • 如何实例化 cusSpinner ?
  • 这是有效的解决方案,感谢您节省了我的时间
【解决方案2】:

试试下面的代码:

spinner.setOnItemSelectedListener(this);

@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) 
{
     switch(arg2)
     {
          case 0:
          {
               Dialog dialog = new Dialog(getApplicationContext());
               .......
               dialog.show();
               spinner.setSelection(0);
          }
          break;
     }
[...]

【讨论】:

  • 请自行测试此代码并尝试它是否按预期工作。 (这不起作用)
猜你喜欢
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多