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..

enter image description here

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

Popular posts from this blog

c# - SVN Error : "svnadmin: E205000: Too many arguments" -

c# - Copy ObservableCollection to another ObservableCollection -

All overlapping substrings matching a java regex -