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:
- spinner view inflated
- adapter(data sources) set
- selection set , selectionnotifier runnable posted
- selection listener set on spinner
- selectionnotifier processed on mainthread
- 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:
- spinner view inflated
- adapter(data sources) set
- selection set , selectionnotifier runnable posted
- runnable set selection listener on spinner posted
- selectionnotifier processed on mainthread
- selectionnotifier has no listeners notify nothing. no toast displayed!
- our runnable set selection listener on spinner processed on main thread , selection listener set
Comments
Post a Comment