Android Spinner: 选择相同的项时不调用onItemSelected监听器

3
我有一个需求,当选择Spinner的第二个项目时,显示一个AlertDialog。我知道使用onItemSelected可以监听Spinner的选择并显示弹出窗口。问题在于,当我选择第二个项目时,对话框会出现,但是在关闭对话框后再次选择相同的项目时,它不会显示对话框,因为onItemSelected不会被调用。有没有解决这个问题的方法?而且不能使用自定义的Spinner实现。

发布你的代码。如果没有代码的问题将会被人贴下来。 - Harish Sridharan
1
@HarishSridharan,大多数情况下这是真的,但这正是不需要代码的问题类型。如果你了解情况,那么重新构建 OP 的代码可能相当简单。使用一个带有监听器的“Spinner”,检查“position”参数并进行某些操作并不难。我认为有些人会因为某种原因而对他们不理解的问题投反对票。 - TWiStErRob
@TWiStErRob 谢谢..你说了我本来要评论的..这不需要任何代码就可以理解。一个Spinner,它的监听器和它完成了。 - Sujay
@sJy 尝试在监听器中使用 spinner.setSelection(Spinner.INVALID_POSITION);,这样 onItemSelected 事件总是会触发一个 onNothingSelected 事件。这意味着您将失去跟踪所选项目的功能,但我认为对于这种情况来说并不是很重要。您也可以尝试仅在 position == 1 时调用。 - TWiStErRob
@sJy,第二次选择时弹出的对话框怎么样?这是关键。 - TWiStErRob
显示剩余2条评论
2个回答

4
创建自定义下拉框
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;
    }

}

Set 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);

1
谢谢。实际上我想知道是否可以在没有自定义下拉框的情况下完成这个操作。我知道自定义下拉框可以轻松处理这个问题。 - Sujay
我正在尝试将此功能添加到React Native中,但不确定如何修改它以实现此目的。请问您能否给出一些提示,告诉我需要在此文件中进行哪些最小更改才能实现此目标 - https://github.com/facebook/react-native/blob/1e8f3b11027fe0a7514b4fc97d0798d3c64bc895/ReactAndroid/src/main/java/com/facebook/react/views/picker/ReactPicker.java#L80 - 我是一个JavaScript开发者,这是我第一次涉足Java。 - Noitidart
FYR- ISSUE 15556 - Anoop M Maddasseri
如何实例化 cusSpinner? - पone
这是可行的解决方案,感谢您挽救了我的一天。 - Parth Patel

-3

尝试下面的代码:

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;
     }
[...]

1
请自行测试此代码并尝试其是否按预期工作。(这不起作用) - Sujay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接