ignore OnItemSelectedListener firing on create

后端 未结 5 1510
悲&欢浪女
悲&欢浪女 2021-02-19 06:48

I\'m creating a spinner and I\'ve added an OnItemSelectedListener to it. However I\'ve noticed that it fires on create. Now I was wondering if there wa

相关标签:
5条回答
  • 2021-02-19 07:03

    Well I think I found nice solution for me, I had it in mind from start but... I have custom wrapper class based on android Handler , that is called DoLater, and also there is custom Adapter based on Listener so you cant copy paste this but you will get idea. Dangerous thing is just that somehow delay 500 can be to long and View can be already destroyed (when user do some wired stuff quickly or phone gets slow...) so DoLater cares of that so it is not called when activity is not resumed. But this way OnItemSelectedListener is not fired on create.

    public void onResume() {
        super.onResume();
        new DoLater(this, 500) {
                    public void run() {
                        new OnSpinnerSelectedAdapter(getBowSpinner()) {
                            protected void onItemSelected(int position) {
                                onBowSelected(position);
                            }
                        };
                    }
                };
    }
    
    0 讨论(0)
  • 2021-02-19 07:20

    Here is my solution.

    I need to ignore the first item selection event because there is a dependency between the Route Grade Spinner and the Route Checkbox.

    And all my controls are setup based on a previous visit to the activity.

    // Used to count the number of times the onItemSelected gets fired
    private int mGradeSelectionCount = 0;
    
    private void attachHandlers() {
        OnItemSelectedListener gradeRangeSelectionMadeListener;
        gradeRangeSelectionMadeListener = new OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapter, View view, int position, long id) {
                // If the counter is 0 then we can assume that it is android firing the event
                if (mGradeSelectionCount++ < 1) {
                    return;
                }
                if (mCmbGradeFrom.getSelectedItemPosition() == 0) {
                    // Uncheck the Route checkbox
                    mChkTypeRoute.setChecked(false);
                } else {
                    // Check the Route checkbox
                    mChkTypeRoute.setChecked(true);
                }
            }
            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                // Dont care, keep the same values as before
    
            }
        };
        mCmbGradeFrom.setOnItemSelectedListener(gradeRangeSelectionMadeListener);
        mChkTypeRoute.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (!isChecked) {
                    mCmbGradeFrom.setSelection(0);
                    mCmbGradeTo.setSelection(0);
                }
            }
        });
    }
    
    0 讨论(0)
  • 2021-02-19 07:20

    You should not attempt to prevent the call to the OnItemSelectedListener.

    By default, Android Spinners select the first item returned by the Adapter, and therefore the OnItemSelectedListener is called to trigger some action on that item.

    I would advise that the first item in your Spinner Adapter be a blank item, and your OnItemSelectedListener can ignore that blank item based on its id.

    0 讨论(0)
  • 2021-02-19 07:23

    This may help you.

    @Override  
    public void onItemSelected( AdapterView<?> parent, View view, int position, long id)
    {
        if(view!=null &&  view.getId()!=0){
            //do your code here to avoid callback twice 
        }
    }
    
    0 讨论(0)
  • 2021-02-19 07:26

    If anyone else comes across this question, it may be worth having a look at a related question I asked a while ago, which has several answers with good ideas on how to work around this issue.

    0 讨论(0)
提交回复
热议问题