android - Subscribe a Navigation Drawer to an Observable -
i want populate navigation drawer subscribing observable gets data db , when done, notifies subscriber (using rxjava). i've done similar subscriber being class extends fragment, different in navigation drawer not separate fragment, rather, defined in mainactivity.
how subscribe navigation drawer observable?
mainactivity.java
private drawerlayout mdrawerlayout; private listview mdrawerlist; @override public void onstart() { mloadandstoredataobservable = observable.create( super.onstart(); new observable.onsubscribe<string>() { // fragment creation code here // populates string[] mystringarray navigation drawer permitssqlitemanager.addlogline(mactivity, logstring); if (!skiprestfulservicecall) { getdatafromrestfulservice(); } } catch (exception e) { else { // data sqlite log.e("loadandstoredata ", "exception: " + e.getmessage()); getdatafromsqlite(); mprogressdialog.dismiss(); } } } mtitle = mdrawertitle = gettitle(); } mdrawerlayout = (drawerlayout) findviewbyid(r.id.drawer_layout); .subscribeon(schedulers.io()) mdrawerlist = (listview) findviewbyid(r.id.left_drawer); .observeon(androidschedulers.mainthread()) .subscribe(mdrawerlayout); // parameter fragment mdrawerlayout.setdrawershadow(r.drawable.drawer_shadow, gravitycompat.start); mdrawerlist.setadapter(new arrayadapter<string>(this, r.layout.drawer_list_item, mystringarray)); mdrawerlist.setonitemclicklistener(new draweritemclicklistener()); // enable actionbar app icon behave action toggle nav drawer getactionbar().setdisplayhomeasupenabled(true); getactionbar().sethomebuttonenabled(true); mdrawertoggle = new actionbardrawertoggle(this,mdrawerlayout, r.drawable.ic_drawer, r.string.drawer_open,r.string.drawer_close ) { public void ondrawerclosed(view view) { getactionbar().settitle(mtitle); invalidateoptionsmenu(); // creates call onprepareoptionsmenu() } public void ondraweropened(view drawerview) { getactionbar().settitle(mdrawertitle); invalidateoptionsmenu(); // creates call onprepareoptionsmenu() } }; mdrawerlayout.setdrawerlistener(mdrawertoggle); } private void getdatafromrestfulservice() { <get data> // implement rxjava-observable/subscriber mloadandstoredataobservable = observable.create( new observable.onsubscribe<string>() { @override public void call(subscriber<? super string> subscriber) { try { utilities.loadandstoredata(mactivity); subscriber.onnext("utilities.loadandstoredata done"); //subscriber.oncompleted(); log.e("mainactivity.oncreate()", "subscriber.onnext(\"utilities.loadandstoredata done\")"); string logstring = "mainactivity.oncreate() - subscriber.onnext(utilities.loadandstoredata done)"; log.e(tag, logstring); permitssqlitemanager permitssqlitemanager = permitssqlitemanager.getinstance(); permitssqlitemanager.addlogline(mactivity, logstring); mprogressdialog.dismiss(); } catch (exception e) { log.e("loadandstoredata ", "exception: " + e.getmessage()); subscriber.onerror(e); mprogressdialog.dismiss(); } } } ) .subscribeon(schedulers.io()) .observeon(androidschedulers.mainthread()) .subscribe(mdrawerlayout); // compile error // suscriber fragment, no longer }
if mdrawerlayout instance of class implement observer can cast observer
navigationdrawer mdrawerlayout = ... yourobservable.subscribe((observer)mdrawerlayout); if not implement observer interface, can create new observer manipulate navigation drawer. (you may need declare mdrawerlayout final)
final navigationdrawer mdrawerlayout = ... yourobservable.subscribe(new observer<string>() { @override public void oncompleted() { // on completed } @override public void onerror(throwable throwable) { // on error } @override public void onnext(string people) { mdrawerlayout.dosomething(); } });
Comments
Post a Comment