android - Why does Spinner control still display prompt information even if the event setOnItemSelectedListener is after setSelection? -


i write event setonitemselectedlistener of spinner after spinnerranger.setselection.

i think toast.maketext(...) not launch when run app first time, prompt information still displayed, why?

@override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) {     view rootview = inflater.inflate(r.layout.cleanup_delete_fragment_old, container, false);      mview = rootview;     mcontext = rootview.getcontext();      initvalueofcontrols();     return rootview; }  private void initvalueofcontrols() {     spinnerranger = (spinner)mview.findviewbyid(r.id.spinner);     publicparfun.fillrangespinner(mview, spinnerranger);     spinnerranger.setselection(publicparfun.getindexofrangedeleteold(mcontext));     spinnerranger.setonitemselectedlistener(new adapterview.onitemselectedlistener() {         @override         public void onitemselected(adapterview<?> parent, view view, int position, long id) {             toast.maketext(mcontext, "my "+position, toast.length_long).show();         }          @override         public void onnothingselected(adapterview<?> parent) {         }     }); } 

to trevor carothers:

if insert dolongtimeoperation() before selection listener event, still display toast?

private void initvalueofcontrols() {     spinnerranger = (spinner)mview.findviewbyid(r.id.spinner);     publicparfun.fillrangespinner(mview, spinnerranger);     spinnerranger.setselection(publicparfun.getindexofrangedeleteold(mcontext));      dolongtimeoperation();      spinnerranger.setonitemselectedlistener(new adapterview.onitemselectedlistener() {         @override         public void onitemselected(adapterview<?> parent, view view, int position, long id) {             toast.maketext(mcontext, "my " + position, toast.length_long).show();         }          @override         public void onnothingselected(adapterview<?> parent) {         }     }); } 

code a:

private void initvalueofcontrols() {     spinnerranger = (spinner)mview.findviewbyid(r.id.spinner);     publicparfun.fillrangespinner(mview, spinnerranger);     spinnerranger.setselection(publicparfun.getindexofrangedeleteold(mcontext));      dolongtimeoperation();      spinnerranger.post(new runnable() {         @override         public void run() {             spinnerranger.setonitemselectedlistener(new adapterview.onitemselectedlistener() {                 @override                 public void onitemselected(adapterview<?> parent, view view, int position, long id) {                     toast.maketext(mcontext, "my "+position, toast.length_long).show();                 }                  @override                 public void onnothingselected(adapterview<?> parent) {                 }             });         }     }); } 

code b

private void initvalueofcontrols() {     spinnerranger = (spinner)mview.findviewbyid(r.id.spinner);     publicparfun.fillrangespinner(mview, spinnerranger);     spinnerranger.setselection(publicparfun.getindexofrangedeleteold(mcontext));     spinnerranger.post(new runnable() {         @override         public void run() {             spinnerranger.setonitemselectedlistener(new adapterview.onitemselectedlistener() {                 // ...             }         }     }); } 

code c

private void initvalueofcontrols() {     spinnerranger = (spinner)mview.findviewbyid(r.id.spinner);     publicparfun.fillrangespinner(mview, spinnerranger);     spinnerranger.setselection(publicparfun.getindexofrangedeleteold(mcontext));     spinnerranger.setonitemselectedlistener(new adapterview.onitemselectedlistener() {         // ...     }); } 

i ran code own basic arrayadapter , displayed toast when view created , setselection() called before listener set(as have above).

this unintuitive, since setting listener after selection has been set. way bottom of take deep dive source code. after rummaging around found out posting this runnable main thread notify listener of selection changes. order of events:

  1. spinner view inflated
  2. adapter(data sources) set
  3. selection set , selectionnotifier runnable posted
  4. selection listener set on spinner
  5. selectionnotifier processed on mainthread
  6. selectionnotifier calls onitemselected() , toast displayed

post runnable set selection listener, gets processed after selectionnotifier first pass-through:

private void initvalueofcontrols() {     spinnerranger=(spinner)mview.findviewbyid(r.id.spinner);     publicparfun.fillrangespinner(mview, spinnerranger);      spinnerranger.setselection(publicparfun.getindexofrangedeleteold(mcontext));     spinnerranger.post(new runnable() {     @override         public void run() {             spinnerranger.setonitemselectedlistener(new adapterview.onitemselectedlistener() {...}         }     }); } 

the new order of events is:

  1. spinner view inflated
  2. adapter(data sources) set
  3. selection set , selectionnotifier runnable posted
  4. runnable set selection listener on spinner posted
  5. selectionnotifier processed on mainthread
  6. selectionnotifier has no listeners notify nothing. no toast displayed!
  7. our runnable set selection listener on spinner processed on main thread , selection listener set

Comments