Spinner onItemSelected错误地调用(无需用户操作)

And*_*der 26 android spinner android-spinner

我有一个微调器,我在对话框视图中显示,并且onItemSelected调用对话框开始的那一刻.我真的不想处理这个,但只有当用户做出选择时.所以我要么阻止这种情况(可能是因为没有设置默认值?),或者我需要知道进行此选择的用户不是?

小智 41

Bill Mote解决方案精神的另一个选择是使其成为OnItemSelectedListener一个OnTouchListener.然后,可以在onTouch方法中将用户交互标志设置为true,并在onItemSelected()处理选择更改后重置.我更喜欢这种解决方案,因为用户交互标志专门为微调器处理,而不是针对活动中可能影响所需行为的其他视图.

在代码中:

为微调器创建监听器:

public class SpinnerInteractionListener implements AdapterView.OnItemSelectedListener, View.OnTouchListener {

    boolean userSelect = false;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        userSelect = true;
        return false;
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
        if (userSelect) { 
            // Your selection handling code here
            userSelect = false;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

将侦听器作为an OnItemSelectedListener和an 添加到微调器OnTouchListener:

SpinnerInteractionListener listener = new SpinnerInteractionListener();
mSpinnerView.setOnTouchListener(listener);
mSpinnerView.setOnItemSelectedListener(listener);
Run Code Online (Sandbox Code Playgroud)

  • 有史以来最好的解决方案!在恢复"片段"的状态时,可以避免那些不需要的项目选择. (3认同)

Gün*_*kin 22

你可以简单地添加一个int计数来解决它:)

 sp.setOnItemSelectedListener(new OnItemSelectedListener() {
    int count=0;
    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        if(count >= 1){
            int item = sp.getSelectedItemPosition();
            Toast.makeText(getBaseContext(),
                 "You have selected the book: " + androidBooks[item],
                  Toast.LENGTH_SHORT).show();
        }
        count++;
    }


    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 在我的例子中,我只使用了布尔值`isLoaded`,因为它比计数器更有意义 (16认同)

Bil*_*ote 9

从API级别3开始,您可以在具有布尔值的Activity上使用onUserInteraction()来确定用户是否正在与设备进行交互.

http://developer.android.com/reference/android/app/Activity.html#onUserInteraction()

@Override
public void onUserInteraction() {
    super.onUserInteraction();
    userIsInteracting = true;
}
Run Code Online (Sandbox Code Playgroud)

作为活动的一个领域,我有:

private boolean userIsInteracting;
Run Code Online (Sandbox Code Playgroud)

最后,我的微调器:

    mSpinnerView.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View view, int position, long arg3) {
            spinnerAdapter.setmPreviousSelectedIndex(position);
            if (userIsInteracting) {
                updateGUI();
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {

        }
    });
Run Code Online (Sandbox Code Playgroud)

当你来完成活动时,布尔值会重置为false.奇迹般有效.


Som*_*ere 6

Androider,我找到了解决这个问题的方法并在此处发布(带代码示例):

当没有假设时,Spinner onItemSelected()会执行

  • 哈哈哈,作为这个问题的副本而被关闭的问题的链接...被接受作为这个问题的答案:) (49认同)