代码之家  ›  专栏  ›  技术社区  ›  Zordid

如何禁用按代码设置选定项时要调用的OnItemSelectedListener

  •  32
  • Zordid  · 技术社区  · 15 年前

    只是想知道如何处理以下问题:根据两个微调器的选定项计算结果。为了处理UI,即用户在其中一个微调器中选择一个新项,我使用 setOnItemSelectedListener 为我的旋转器 onCreate() 活动的方法。

    现在:当然可以了。听者的工作是触发对结果的新计算。

    问题是:因为我截获了 onPause() onResume() 为了保存/恢复最后的状态,我得到了一个方法 集合 这两个微调器的选定项以编程方式如下所示:

    startSpinner.setSelection(pStart);
    destSpinner.setSelection(pDest);
    

    这两个调用也会调用侦听器!我的结果计算方法加上新结果集的通知在这里被调用两次!

    一个愚蠢的直接方法是使用一个布尔变量 停用 无论监听器在内部做什么,在设置选定项之前设置它,然后重置它。 可以。但是有更好的方法吗??

    我不想让侦听器被代码操作调用,只由用户操作调用!:

    你是怎么做到的? 谢谢!

    11 回复  |  直到 15 年前
        2
  •  44
  •   Andres Q.    11 年前

    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;
            }
        }
    
    }
    

    SpinnerInteractionListener listener = new SpinnerInteractionListener();
    mSpinnerView.setOnTouchListener(listener);
    mSpinnerView.setOnItemSelectedListener(listener);
    

        3
  •  11
  •   Zordid    15 年前

    onCreate onResume

    • currentPos1 currentPos2
    • onItemSelectedListener() refreshMyResult()

    int newPos1 = mySpinner1.getSelectedItemPosition();
    int newPos2 = mySpinner2.getSelectedItemPosition();
    // only do something if update is not done yet
    if (newPos1 != currentPos1 || newPos2 != currentPos2) {
        currentPos1 = newPos1;
        currentPos2 = newPos2;
    
        // do whatever has to be done to update things!
    
    }
    

        4
  •  3
  •   dandan78 Tom Cool    7 年前

      Boolean check = false;
    

     holder.filters.setOnTouchListener(new View.OnTouchListener() {
                   @Override
                   public boolean onTouch(View v, MotionEvent event) {
    
                       check = true;
                       return false;
                   }
               });
    
               holder.filters.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
               {
    
                   @Override
                   public void onItemSelected(AdapterView<?> parent, View arg1, int position, long id)
                   {
                       flag = filterids.get(position);
    
                       if(check)
                       {
                           check = false;
                           new Applyfilters().execute(flag,"3");
                       }else{
    
                       }
    
                   }
    
                   @Override
                   public void onNothingSelected(AdapterView<?> arg0)
                   {
                       // TODO Auto-generated method stub
                   }
               });
    

        5
  •  2
  •   joe    12 年前

    Spinner.setSelection(int position, boolean animate) false

        6
  •  2
  •   Zordid    12 年前

        7
  •  2
  •   a.black13    10 年前

    spinner.setSelection(withAction,position);
    

    https://github.com/scijoker/spinner2

        8
  •  1
  •   Graeme Duncan    15 年前

    OnItemSelectedListener onResume

        9
  •  1
  •   Ivo Stoyanov    11 年前

    private mIsSpinnerFirstCall=true;
    
    ...
    Spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            //If a new value is selected (avoid activating on setSelection())
            if(!mIsSpinnerFirstCall) {
                // Your code goes gere
            }
            mIsSpinnerFirstCall = false;
        }
    
        public void onNothingSelected(AdapterView<?> arg0) {
        }
    });
    

        10
  •  1
  •   Burak    7 年前

    boolean shouldWork = true;
    

    Spinner spinner = findViewById(R.id.spinner);
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView adapter, View v, int i, long lng) {
            if (shouldWork) {
                   // Do your actions here
            }
            else
                shouldWork = true;
        }
        public void onNothingSelected(AdapterView<?> parentView)  {
    
        }
    });
    

    shouldWork = false;
    spinner.setSelection(0);
    
        11
  •  0
  •   Jaya    7 年前
        This following method will help you to stop invoking automatically the selection listener
    
    
        yourspinnerobj.post(new Runnable() {
                    @Override
                    public void run() {
                        yourspinnerobj.setOnItemSelectedListener(yourspinnerlistener);
                    }
                });
    
    推荐文章