Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Undesired onItemSelected calls

Tags:

I have 36 spinners that I have initialized with some values. I have used onItemSelectedListener with them. As usual, the user can interact with these spinners, firing the onItemSeected function.

One problem is that the call is made during init, but I found solutions to it here and avoided that using a global variable "count" and checking if count > 36 before executing code inside onItemSelected.

My problem is this: The user has the option to click on a button called "Previous", upon which I have to reset SOME of the spinner values.

I tried changing the value of count to 0 before resetting the spinners, and then changing it back to 37 after resetting, but I have come to understand that the onItemSelected is called only after every other function is done executing, so it is called AFTER count is changed back to 37 even though the spinner values are set as soon as they are selected by user.

I need to repeatedly refresh some spinners WITHOUT firing off the onItemSelected function. Can anyone please help me find a solution? Thanks.

like image 932
Vedavyas Bhat Avatar asked Feb 13 '14 07:02

Vedavyas Bhat


2 Answers

I found a simple and, I think, elegant solution. Using tags. I first created a new XML file called 'tags' and put in the following code:

<resources xmlns:android="http://schemas.android.com/apk/res/android">   <item name="pos" type="id" /> </resources> 

Whenever I myself use spin.setSelection(pos), I also do spin.setTag(R.id.pos, pos), so I am setting the current position as a tag.

Then, in onItemSelected, I am executing code only if(spin.getTag(R.id.pos) != position), where position is the position variable supplied by the function. In this way, my code is executed only when the user is making a selection. Since the user has made a selection, the tag has not been updated, so after the processing is done, I update the tag as spin.setTag(R.id.pos, position).

NOTE: It is important to use the same adapter throughout, or the "position" variable might point to different elements.

EDIT: As kaciula pointed out, if you're not using multiple tags, you can use the simpler version, that is spin.setTag(pos) and spin.getTag() WITHOUT the need for an XML file.

like image 113
Vedavyas Bhat Avatar answered Oct 07 '22 11:10

Vedavyas Bhat


When Spinner.setSelection(position) is used, it always activates setOnItemSelectedListener()

To avoid firing the code twice I use this solution:

     private Boolean 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) {         }     }); 
like image 34
Ivo Stoyanov Avatar answered Oct 07 '22 12:10

Ivo Stoyanov