Android spinner onItemSelected called multiple times after screen rotation

I have a layout with three counters. They differ in the option presented in the drop-down list.
In my onCreateViewI have a method for setting counters. Inside this method, I have something like this:

  mySpinner = (Spinner) view.findViewById(R.id.my_spinner);
  ArrayAdapter<String> mySpinner =
            new ArrayAdapter<String>(getActivity(), R.layout.background,
                    new ArrayList<String>(Arrays.asList(getResources().getStringArray(R.array.spinner_one_data))));
  mySpinner.setDropDownViewResource(R.layout.spinner_text);
  mySpinner.setAdapter(mySpinner);
  mySpinner.setOnItemSelectedListener(this);

As I said, my other two spinners are almost the same, but with different options.

I know that it onItemSelectedis called once for each counter in the "first installation", so I have a flag to prevent this problem. With this flag decision, my counters work as expected.

The problem is that I select an option in each spinner and then rotate the screen. Now it onItemSelectedis called 6 times instead of the 3 times that I expected (I set a flag to manage this situation with 3 calls).

Why is this happening and how should I deal with it?

+7
source share
3 answers

I found a solution that works for me.

I have 3spinners, so onItemSelectedcalled 3fold in the initial spinner setup. To avoid onItemSelectedrunning the method in the initial setup, I created a counter, so onItemSelectedonly the value of the counter starts the corresponding method.

, onItemSelected 3, , 0.

:

3 spinners, 2 , 0, ​​:

First spinner - > Item 2 selected
Second spinner -> Item 0 selected (no changes)
Third spinner -> Item 1 selected

, , onItemSelected 3 2 , 0.

@Override
public void onSaveInstanceState(Bundle outState) {
    int changedSpinners = 0;
    if (spinner1.getSelectedItemPosition() != 0) {
        changedSpinners += 1;
    }
    if (spinner2.getSelectedItemPosition() != 0) {
        changedSpinners += 1;
    }
    if (spinner3.getSelectedItemPosition() != 0) {
        changedSpinners += 1;
    }
    outState.putInt("changedSpinners", changedSpinners);
}

onSaveInstanceState, onCreateView , savedInstanceState != null, , changedSpinners , .

+1

, , , onItemSelected, . OnTouchListener, .

:

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

}

OnItemSelectedListener, OnTouchListener:

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

Andres Q. answer... Java 8, , -. onTouchListener

Boolean spinnerTouched = false;
yourSpinner.setOnTouchListener((v,me) -> {spinnerTouched = true; v.performClick(); return false;});

yourSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

        if(spinnerTouched){
            //do your stuff here
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        //nothing selected
    }
});
0

Source: https://habr.com/ru/post/1569733/


All Articles