I've thought of some less than elegant ways to solve this, but I know I must be missing something.
My onItemSelected fires off immediately without any interaction with the user, and this is undesired behavior. I wish for the UI to wait until the user selects something before it does anything.
I even tried setting up the listener in the onResume, hoping that would help, but it doesn't.
How can I stop this from firing off before the user can touch the control? THANKS
public class CMSHome extends Activity {
private Spinner spinner;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Heres my spinner ///////////////////////////////////////////
spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.pm_list, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
};
public void onResume() {
super.onResume();
spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
}
public class MyOnItemSelectedListener implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent,
View view, int pos, long id) {
Intent i = new Intent(CMSHome.this, ListProjects.class);
i.putExtra("bEmpID", parent.getItemAtPosition(pos).toString());
startActivity(i);
Toast.makeText(parent.getContext(), "The pm is " +
parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
}
public void onNothingSelected(AdapterView parent) {
// Do nothing.
}
}
}
Source: Tips4all
I would have expected your solution to work -- I though the selection event would not fire if you set the adapter before setting up the listener.
ReplyDeleteThat being said, a simple boolean flag would allow you to detect the rogue first selection event and ignore it.
this solved my problem so maybe someone could find it useful too ;-)
ReplyDeleteAndroid Spinner selection
I have found a solution for this problem and posted it here (with code sample):
ReplyDeleteSpinner onItemSelected() executes when it is not suppose to.
I would try to call
ReplyDeletespinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
after you call setAdapter(). Also try out calling before the adapter.
You always have the solution to go with subclassing, where you can wrap a boolean flag to your overriden setAdapter method to skip the event.
Referring to the answer of Dan Dyer try to register the OnSelectListener in a post(Runnbale) method:
ReplyDeletespinner.post(new Runnable() {
public void run() {
spinner.setOnItemSelectedListener(listener);
}
});
By doing that for me the wished behavoir finally occurred.
In this case it also means that the listener only fires on a changed item.
You can look at this solution, it is easy and practical.
ReplyDeletehttp://stackoverflow.com/a/10102356/621951