Android TabsAdapter with ActionbarSherlock -
i using actionbarsherlock sherlocklistfragment implements loadermanager.loadercallbacks.
in applicationactivity oncreate method using
setcontentview(r.layout.application);
to set layout -- works great.
i initializing actionbar so
actionbar bar = getsupportactionbar(); bar.setnavigationmode(actionbar.navigation_mode_tabs); bar.setdisplayoptions(0, actionbar.display_show_title); bar.setdisplayhomeasupenabled(false); bar.setdisplayshowtitleenabled(true); // users event list bar.addtab(bar.newtab() .settag("event_list") .settext(getstring(r.string.list_events_header)) .settablistener(new tablistener<eventlistfragment>( this, getstring(r.string.list_events_header), eventlistfragment.class, null)));
within applicationactivity, have asynctask takes couple of seconds load on initial open, , when manually refreshed against api - means need make sure update listview on fragment instantiated above, in onpostexecute method, here how that:
// update events fragment eventlistfragment fragment = (eventlistfragment) getsupportfragmentmanager().findfragmentbyid(r.string.list_events_header); if(fragment != null) { // restart loader fragment, refreshing listview getsupportloadermanager().restartloader(0, null, fragment); }
this works
now, wanted put in tabsadapter fancy swiping tabs, i've done, , works, last part mentioned onpostexecute, doesnt work :(
this tabsadapter:
package com.lateral.app.ui; import java.util.arraylist; import android.content.context; import android.os.bundle; import android.support.v4.app.fragment; import android.support.v4.app.fragmentpageradapter; import android.support.v4.app.fragmenttransaction; import android.support.v4.view.viewpager; import com.actionbarsherlock.app.actionbar; import com.actionbarsherlock.app.actionbar.tab; public class apptabsadapter extends fragmentpageradapter implements actionbar.tablistener, viewpager.onpagechangelistener { private final context mcontext; private final actionbar mactionbar; private final viewpager mviewpager; private final arraylist<tabinfo> mtabs = new arraylist<tabinfo>(); static final class tabinfo { private final class<?> clss; private final bundle args; tabinfo(class<?> _class, bundle _args) { clss = _class; args = _args; } } public apptabsadapter(applicationactivity activity, viewpager pager) { super(activity.getsupportfragmentmanager()); mcontext = activity; mactionbar = activity.getsupportactionbar(); mviewpager = pager; mviewpager.setadapter(this); mviewpager.setonpagechangelistener(this); } public apptabsadapter(eventactivity activity, viewpager pager) { super(activity.getsupportfragmentmanager()); mcontext = activity; mactionbar = activity.getsupportactionbar(); mviewpager = pager; mviewpager.setadapter(this); mviewpager.setonpagechangelistener(this); } public void addtab(actionbar.tab tab, class<?> clss, bundle args) { tabinfo info = new tabinfo(clss, args); tab.settag(info); tab.settablistener(this); mtabs.add(info); mactionbar.addtab(tab); notifydatasetchanged(); } @override public int getcount() { return mtabs.size(); } @override public fragment getitem(int position) { tabinfo info = mtabs.get(position); return fragment.instantiate(mcontext, info.clss.getname(), info.args); } public void onpagescrolled(int position, float positionoffset, int positionoffsetpixels) { } public void onpageselected(int position) { mactionbar.setselectednavigationitem(position); } public void onpagescrollstatechanged(int state) { } public void ontabselected(tab tab, fragmenttransaction ft) { object tag = tab.gettag(); (int = 0; < mtabs.size(); i++) { if (mtabs.get(i) == tag) { mviewpager.setcurrentitem(i); } } } public void ontabunselected(tab tab, fragmenttransaction ft) { } public void ontabreselected(tab tab, fragmenttransaction ft) { } }
this updated oncreate method applicationactivity
mviewpager = new viewpager(this); mviewpager.setid(r.id.pager); setcontentview(mviewpager); actionbar bar = getsupportactionbar(); bar.setnavigationmode(actionbar.navigation_mode_tabs); bar.setdisplayoptions(0, actionbar.display_show_title); bar.setdisplayhomeasupenabled(false); bar.setdisplayshowtitleenabled(true); mtabsadapter = new apptabsadapter(this, mviewpager); // users event list mtabsadapter.addtab(bar.newtab() .settag("event_list") .settext(getstring(r.string.list_events_header)) .settablistener(new tablistener<eventlistfragment>( this, getstring(r.string.list_events_header), eventlistfragment.class, null)), eventlistfragment.class, null);
and update made onpostexecute method in applicationactivity
// update events fragment eventlistfragment fragment = (eventlistfragment) mtabsadapter.getitem(0); if(fragment != null) { // restart loader fragment, refreshing listview getsupportloadermanager().restartloader(0, null, fragment); }
basically, when attempts run onpostexecute code
i nullpointerexception cursoradapter within fragment.. found fragment..
edit -- requested code
public loader<cursor> oncreateloader(int loaderid, bundle args) { log.d(tag, "oncreateloader"); return new eventcursorloader(getactivity()); } public static final class eventcursorloader extends simplecursorloader { context mcontext; public eventcursorloader(context context) { super(context); log.d("eventcursorloader", "constructor"); mcontext = context; } @override public cursor loadinbackground() { log.d("eventcursorloader", "loadinbackground"); eventsdatasource datasource = new eventsdatasource(mcontext, ((applicationactivity)mcontext).getdbhelper()); sharedpreferences app_preferences = preferencemanager.getdefaultsharedpreferences(mcontext); long userid = app_preferences.getlong("authenticated_user_id", 0); return datasource.getallevents(userid); } }
attempting retrieve loader here wrong idea, purpose refresh data. after doing digging found can notify more 1 set of content load in provider using
getcontext().getcontentresolver().notifychange(uri, null);
which notifies of change , refreshes, code can deleted , replaced single line.
Comments
Post a Comment